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

标签 delphi

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

在帮助中还有一个“奇怪”的例子: ms-help://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

最佳答案

精确值 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 中的浮点文字具有扩展类型,如您所见,您的数字的扩展版本略高于 87.285,因此舍入到最接近的值会向上舍入是正确的。但作为Double,实际数字略低。这就是为什么如果在调用 RoundTo 之前将数字显式存储在 Double 变量中,就会得到预期的数字。 Delphi 的每种浮点类型都有该函数的重载。

关于delphi - 为什么 RoundTo(87.285, -2) => 87.28 的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25519621/

相关文章:

delphi - 使用 Lazarus 和 FreePascal 获取 Linux 系统信息

delphi - 什么是TExternalThread? "Cannot terminate externally created thread"终止基于线程的计时器时

delphi - Unicode 字符串中的奇数字符

delphi - 动态数组变量未显示在局部变量调试窗口中

delphi - 通过仅指定路径来创建TImageList

arrays - Delphi XE6 中使用枚举声明数组错误

forms - TForm 上的 Align 和 Anchor 属性有什么用?

当在对具体接口(interface)类型的引用上调用函数时,Delphi 调用了我的通用接口(interface)的不正确函数

delphi - 在 TOpenDialog 中右键单击文件时,使用自定义样式会显示无效字符

delphi - 相互使用的类的循环引用问题