我预计结果将是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
答案 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
。