Pascal 帕斯卡双精度值不准确,如何解决?
我一直在解决一个在UVA编程的挑战,并得到了这个问题,这是真的很奇怪。以下是有缺陷的代码: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
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-52Double
存储形式为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
的有效数字。哈,我不知道。:)谢谢,我很确定我很久以前就遇到过这个问题,是的,舍入确实解决了这个问题。嗯,我不知道。:)谢谢,我很确定我很久以前就遇到过这个问题,是的,舍入确实解决了这个问题。