【问题标题】:How does java round an integer when stored in a floating point存储在浮点中时java如何对整数进行舍入
【发布时间】:2014-09-12 08:13:34
【问题描述】:

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

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

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

请注意,我使用浮点数或引用浮点数,我将其与 Double 互换使用。与整数和长整数相同。

【问题讨论】:

  • 转换为浮点数时不需要“四舍五入”整数。最坏的情况是整数中的有效位数超过浮点数形式的小数位数,但这只是相当大的数字的问题。
  • Floating Point Casting in Java 的可能重复项

标签: java floating-point numbers rounding


【解决方案1】:

在java中制作浮点数时如何四舍五入?

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

int a = (int) Math.round(d);

典型的例子是 0.1,通常被引用为四舍五入到 0.0999999999998(或类似的值)。

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

您的旧代码在真正应该使用 n 整数时使用浮点数。但是,在代码中更改该变量的每个(或多个)实例的成本很高。

如果产生 double d 的计算只是 +-* 与其他整数的计算,则产生介于 -253 和 253,那么d自动包含一个整数(它是精确的,因为涉及的浮点计算是精确的,它是一个整数,因为精确的结果是一个整数),你可以用更简单的(int) d。另一方面,如果涉及除法或非整数操作数,则不应轻易更改d 的类型,因为它会改变这些计算的结果。

当String是像"1234567890"这样的整数时,调用Float.parseFloat(String)时的行为也会不同吗?

这将产生一个float,其值是最接近有理数1234567890的可表示单精度值。这恰好是1234567936.0f

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

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

【讨论】:

  • 所以,为了清楚起见,当在 Java 中从大整数转换为浮点数(小写)时,它将使用浮点数可以表示的最接近的数字。长期翻倍也是如此。另外,您是否有参考资料,因为它可能包含对我和其他有类似问题或疑问的人有帮助的更多信息。
  • 是的。是的。 Java 遵循 IEEE 754 标准的原则,该标准规定基本转换(十进制 二进制)应根据当前的舍入模式。对于从浮点到整数的转换(通过截断),Java 遵循 C 的传统,它早于 IEEE 754 标准。最后,不要担心其他有类似问题或疑问的人,他们不会阅读这个答案,就像您阅读大量现有文档一样,包括 Java 语言定义、浮点维基百科页面……
  • Java 语言规范,5.1.2. Widening Primitive Conversion 说“从 int 到 float,或从 long 到 float,或从 long 到 double 的扩大的原始转换可能会导致精度损失 - 也就是说,结果可能会丢失该值的一些最低有效位。在这种情况下,生成的浮点值将是整数值的正确舍入版本,使用 IEEE 754 舍入到最近模式(第 4.2.4 节)。 "
  • 投反对票的人,我很高兴听到你发现这个答案有什么问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-09-15
  • 1970-01-01
  • 1970-01-01
  • 2020-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多