Pascal 帕斯卡双精度值不准确,如何解决?

Pascal 帕斯卡双精度值不准确,如何解决?,pascal,freepascal,Pascal,Freepascal,我一直在解决一个在UVA编程的挑战,并得到了这个问题,这是真的很奇怪。以下是有缺陷的代码: program WTF; begin WriteLn(Trunc(2.01 * 100)); ReadLn(); end. 显然,我需要将201作为Integer,但我得到的是200,这是因为Double无法存储准确的值。。。这是2.01=2.00(9),原因我不知道,有人能解释一下并提供解决方案吗 编辑:然而,我认为使用Round()而不是Trunc()可以解决这个问题。。。但是,为什么Tru

我一直在解决一个在UVA编程的挑战,并得到了这个问题,这是真的很奇怪。以下是有缺陷的代码:

program WTF;
begin
  WriteLn(Trunc(2.01 * 100));
  ReadLn();
end.
显然,我需要将
201
作为
Integer
,但我得到的是
200
,这是因为Double无法存储准确的值。。。这是
2.01=2.00(9)
,原因我不知道,有人能解释一下并提供解决方案吗


编辑:然而,我认为使用
Round()
而不是
Trunc()
可以解决这个问题。。。但是,为什么
Trunc()
不起作用呢?

Double
存储s*2p形式的数字,其中s和p是整数。对于任何整数s,p,数字2.01的形式不是s*2p,因此它不能准确地存储在
Double

这里的解决方案是将
2.01*100
四舍五入到最接近的整数,而不是将其截断。虽然
2.01
并不完全是2.01,但它只比2.01低一点点。四舍五入到最接近的整数将导致201



请注意,如果所说的
2.00(9)
是指
2.009999999…
无限期重复,那么
2.00(9)
而不是您在编写
2.01
时得到的
Double
。与实际2.01最接近的
Double
,您得到的数字是
2.009999999997868371792719699442386627197265625
。它的形式是s*2p:9052235251014696*2-52

Double
存储形式为s*2p的数字,其中s和p是整数。对于任何整数s,p,数字2.01的形式不是s*2p,因此它不能准确地存储在
Double

这里的解决方案是将
2.01*100
四舍五入到最接近的整数,而不是将其截断。虽然
2.01
并不完全是2.01,但它只比2.01低一点点。四舍五入到最接近的整数将导致201



请注意,如果所说的
2.00(9)
是指
2.009999999…
无限期重复,那么
2.00(9)
而不是您在编写
2.01
时得到的
Double
。与实际2.01最接近的
Double
,您得到的数字是
2.009999999997868371792719699442386627197265625
。它的形式是s*2p:9052235251014696*2-52,如果您想获得
200
,您不会使用
Trunc
。使用
Trunc
可以故意截断在转换为整数之前四舍五入到
201
的有效数字。如果要获得
200
,则不使用
Trunc
。使用
Trunc
时,您有意截断在转换为整数之前本应四舍五入到
201
的有效数字。哈,我不知道。:)谢谢,我很确定我很久以前就遇到过这个问题,是的,舍入确实解决了这个问题。嗯,我不知道。:)谢谢,我很确定我很久以前就遇到过这个问题,是的,舍入确实解决了这个问题。