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

mar*_*_ja 20 delphi

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

在帮助中还有一个"奇怪"的例子:ms-help://embarcadero.rs2010/vcl/Math.RoundTo.html

RoundTo(1.235, -2) => 1.24
RoundTo(1.245, -2) => 1.24 //???
Run Code Online (Sandbox Code Playgroud)

有谁知道我需要哪个函数来获得87.29的结果?我的意思是:如果最后一个数字> = 5向上,如果<5向下舍入.正如在学校教的:)

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

也很奇怪:

SimpleRoundTo(87.285, -2) => 87.29
Run Code Online (Sandbox Code Playgroud)

x := 87.285; //double
SimpleRoundTo(x, -2) => 87.28
Run Code Online (Sandbox Code Playgroud)

Rob*_*edy 27

精确值87.285不能表示为Delphi中的浮点值.我的网站上的一个页面显示了该值的真正含义,如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,因此舍入到最近的舍入是正确的.但作为双倍,实际数字略低.这就是为什么如果在调用之前将数字显式存储在Double变量中,则会获得预期的数字RoundTo.每个Delphi的浮点类型都有该函数的重载.

  • +1爱你网站上的那个页面!自动回答所有这些问题! (2认同)

Dav*_*nan 21

87.285不完全可表示,最近的双精度略小.

关于浮点的经典参考是每个计算机科学家应该知道的浮点运算.

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

  • +1.舍入通常只在处理钱时才是关键,而对于钱,我们应该使用"货币".货币可以代表该数字,而舍入将适当地围绕它. (3认同)