当存储在浮点中时,java如何舍入整数

时间:2014-07-21 17:57:35

标签: java floating-point numbers rounding

这是一个经典问题:遗留代码在使用n整数时会使用浮点数。但是,在代码中更改该变量(或几个)的每个实例都很昂贵。因此,您需要编写自己的舍入函数,该函数需要一堆参数来提高精度并转换为整数。

所以,基本的问题是,当它们在java中制作时,浮点数如何变圆?经典的例子是0.1经常引用的四舍五入到0.0999999999998(或类似的东西)。但是,当给定Java中的整数时,浮点数是否总是向下舍入到它可以表示的下一个值?是否将其内部尾数向下舍入以有效地舍入其绝对值?或者它只是选择整数和新浮点之间的最小误差值?

当String是Float.parseFloat(String)之类的整数时,调用"1234567890"时行为也不同吗?当String是一个比Float可以存储的精度更高的浮点时,行为也是一样的。

请注意我使用浮点或参考Float,我可以与Double交替使用。与整数和长整数相同。

1 个答案:

答案 0 :(得分:4)

  

浮点数在java中制作时如何进行舍入?

当您使用(int) d d类型为doublefloat的构造int a = (int) Math.round(d); 时,Java会截断(向零舍入)。如果需要舍入到最接近的整数,可以使用以下行:

double
  

经典的例子是0.1经常被引用为四舍五入到0.0999999999998(或类似的东西)。

您提到的问题与整数不存在,整数可以完全表示为(int) Math.round(d)(对于-2 53 和2 53 之间的那些)。如果您要舍入的数字来自之前的计算,这些计算本应产生一个整数但由于浮点舍入错误而可能没有,那么double可能是您应该使用的解决方案。这意味着只要累积误差不高于0.5,您就会得到正确的整数。

  

你的遗留代码在真正使用n整数时会使用浮点数。但是,在代码中更改该变量(或几个)的每个实例都很昂贵。

如果产生d +的计算只是计算-*d和其他整数,则在-2 53 和2 53 ,然后(int) d自动包含一个整数(这是精确的,因为所涉及的浮点计算是精确的,并且它是一个整数,因为确切的结果是一个整数),您可以使用更简单的d进行转换。另一方面,如果涉及除法或非整数操作数,则不应轻易更改Float.parseFloat(String)的类型,因为它会改变这些计算的结果。

  

当String是"1234567890"之类的整数时调用float时行为也不同吗?

这将生成一个1234567936.0f,其值是理性1234567890的最近可表示的单精度值。这恰好是Float

  

当String是一个比Float可以存储的精度更高的浮点时,行为也是一样的。

从技术上讲,“0.1”比Float可以存储的精度更高。此外,从技术上讲,前面的示例1234567890也比Float.parseFloat("0.1")可以存储的更精确。行为是相同的:float生成与有理数0.1最接近的{{1}}。