为什么RoundTo的结果(87.285,-2)=> 87.28

时间:2011-03-04 08:14:23

标签: delphi

我预计结果将是87.29。我也试过SimpleRoundTo,但产生了相同的结果。

在帮助中还有一个“奇怪”的例子: MS-帮助://embarcadero.rs2010/vcl/Math.RoundTo.html

RoundTo(1.235, -2) => 1.24
RoundTo(1.245, -2) => 1.24 //???

有人知道我需要哪种功能才能获得87.29的结果吗?我的意思是:如果最后一个数字> = 5向上舍入,如果< 5轮向下。正如学校所教导的那样:)

我使用Delphi2010和SetRoundMode(rmNearest)。我也试过rmTruncate。 值87.285存储在double变量中。

也很奇怪:

SimpleRoundTo(87.285, -2) => 87.29

x := 87.285; //double
SimpleRoundTo(x, -2) => 87.28

2 个答案:

答案 0 :(得分:27)

精确值87.285无法表示为Delphi中的浮点值。 A page on my Web site显示了该值的实际值,如Extended,Double和Single:

87.285 = + 87.28500 00000 00000 00333 06690 73875 46962 12708 95004 27246 09375
87.285 = + 87.28499 99999 99996 58939 48683 51519 10781 86035 15625
87.285 = + 87.28500 36621 09375

默认情况下,Delphi中的浮点文字类型为Extended,正如您所看到的,您的数字的扩展版本略高于87.285,因此将舍入到最接近的舍入为正确是正确的。但作为双倍,实际数字略低。这就是为什么如果在调用RoundTo之前将数字显式存储在Double变量中,则会获得预期的数字。每个Delphi的浮点类型都有重载函数。

答案 1 :(得分:21)

87.285不能完全表示,最接近的双倍略小。

关于浮点的经典参考是What Every Computer Scientist Should Know About Floating- Point Arithmetic

对于基于货币的计算,如果确实如此,则应使用基数10数字类型而不是基数2浮点数。在Delphi中,这意味着Currency