【问题标题】:Counting the number of decimal places in pascal计算帕斯卡的小数位数
【发布时间】:2013-05-14 18:37:37
【问题描述】:

我刚开始学习帕斯卡,我必须做一个帕斯卡程序作为家庭作业。 我做到了,但我不知道如何计算实数中的小数位数(“.”后面的位数)。

我需要它来很好地格式化一个实数(比如write(real:0:dec),其中dec 是我不知道如何知道的十进制数字)。我想这样做是因为我不希望它采用科学计数法或带有许多不必要的零。

例如,如果一个实数是 1.51 (x),我写 writeln(x:0:4);或 WriteLn(Format('%*.*f', [0, 4, x]));它会显示 1.5100 但我希望它只是 1.51;如果数字像 1.513436,它将仅显示 1.5134 。所以我会让它像 writeln(x:0:dec);用一些东西使 dec 成为 x 的小数位数。

【问题讨论】:

  • 您添加了通用的“Pascal”标签。请提及 Pascal 的编译器/方言。

标签: decimal pascal real-datatype


【解决方案1】:

Format() 函数通常用于这种情况。

WriteLn(Format('%*.*f', [0, dec, your_real_number]));

*.* 被解释为total_characters.decimal_digits。第一个传递零意味着宽度会根据您的真实大小进行调整。小数位数可以是变量 (dec),您可以根据自己的规范进行调整。


更新:

你提到你想要一个浮点数关于小数位数的精确表示。

正如我在评论中提到的,大多数浮点值没有有限的小数位数。而且大多数小数部分不能用二进制类型表示。

有些库可以处理任意大小的浮点值。例如,请参阅TBigFloat。有一个格式化例程可以从十进制浮点数中去除多余的零。


仍然可以使用通用格式说明符删除尾随零:

WriteLn(Format('%g',[your_real_number]));

您也可以指定宽度和有效位数。

【讨论】:

  • 谢谢,但我仍然不明白如何格式化仅显示所需数字的数字。例如,如果一个实数是 1.51 (x),我写 writeln(x:0:4);WriteLn(Format('%*.*f', [0, 4, x])); 它会显示 1.5100 但我希望它只是 1.51;如果数字像 1.513436,它将仅显示 1.5134 。所以我会把它变成writeln(x:0:dec); 的东西,使dec 成为x 的小数位数。
  • 浮点值通常没有有限的小数位数。此外,浮点数的二进制表示通常不能保持超过几位小数的精确值。单个类型不能完全代表 0.1 作为示例。请参阅此博客 Floating point numbers 以获得浮点值的良好帕斯卡摘要。这里还有一个链接,How deal with the fact that most decimal fractions cannot be accurately represented in binary?
  • Format() 不是帕斯卡,而是特定于 Delphi 和兼容的。
  • @MarcovandeVoort,好的。我以为是 Free Pascal,也许是错的。
  • Delphi 和 FPC 一起是当今 Pascal 的主体。但是他们有自己的(一组)标签。请帮助保持 [pascal] 有点纯净。
【解决方案2】:

例如,如果您输入 x=1.51 为实变量类型,那么您只写 writeln(x),输出将是 1.5100000000。如果写writeln(x:0:3),则输出为1.510(“.”后3位)...

var x: real;
Begin
x:=1.51;
writeln(x); //output 1.5100000000
writeln(x:0:4); //output 1.5100 (4 digits after ".")
writeln(x:0:2); //output 1.51 (2 digits after ".")
readln;
End.

在您的另一个示例中,如果您的输入是 1.512426,则使用 writeln(x:0:5) 它只会在“。”之后显示 5 位数字。输出为 1.51242

var x: real;
Begin
x:=1.512426;
writeln(x); //output 1.5124260000
writeln(x:0:4); //output 1.5124 (4 digits after ".")
writeln(x:0:2); //output 1.51 (2 digits after ".")
readln;
End. 

所以,如果你写writeln(x:0:dec),输出将是“。”之后的“十进制”数字

希望这有帮助,我只是想从不同的角度回答。

【讨论】:

    【解决方案3】:

    如果你真的在做一个 writeln() 输出,肯定只是 writeln(x); 会完成你所追求的吗?如果您真的想计算小数位数,您可能必须转换为字符串,删除所有尾随零,然后查看小数点所在的位置。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多