1

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

我需要它来很好地格式化一个实数(比如我不知道如何知道的十进制数在哪里)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 的小数位数。

4

3 回答 3

2

Format()功能通常用于这种情况。

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

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


更新:

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

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

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


尽管如此,仍有可能通过使用通用格式说明符来删除尾随零:

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

您也可以指定有效数字的宽度和数量。

于 2013-05-14T19:17:30.970 回答
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)输出将是“。”之后的“十进制”数字。

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

于 2013-05-25T19:35:18.820 回答
0

如果您实际上正在执行 writeln() 输出,那么肯定 writeln(x); 会完成您所追求的吗?如果您真的想计算小数位数,您可能必须转换为字符串,删除任何尾随零,然后查看小数点所在的位置。

于 2013-05-16T18:57:49.580 回答