【问题标题】:java integer rounding (division related)java整数舍入(除法相关)
【发布时间】:2016-11-26 17:20:51
【问题描述】:

整数除法没有按预期四舍五入让我感到意外。

简单代码:

public class HelloMath {

    public static void main(String[] args) {
        for (int s=1; s< 20; s++)
        {
            int div = 1<<s;
            int res = (int) ((float)-8/ s);
            System.out.printf("Bit %d, result %d\n", s, res);
        }
    }

}

即使使用显式 (float) 强制转换,输出也是:

Bit 1, result -8
Bit 2, result -4
Bit 3, result -2
Bit 4, result -2
Bit 5, result -1
Bit 6, result -1
Bit 7, result -1
Bit 8, result -1
Bit 9, result 0
Bit 10, result 0
Bit 11, result 0
Bit 12, result 0
Bit 13, result 0
Bit 14, result 0
Bit 15, result 0
Bit 16, result 0
Bit 17, result 0
Bit 18, result 0
Bit 19, result 0

我一直期待-1。

发生这种情况的真实代码是这样的:

public static int fluidTo8th(int fluid)
{
    if (0 == fluid)
        return 0;   // Technically, this isn't needed :-).
    int wholePart = (fluid-1) * 8 / RealisticFluids.MAX_FLUID; // -1 gets rounding correct;
    // consider fluid of exactly 1/8th.
    return 1+wholePart;
}

RealisticFluids.MAX_FLUID 的值为 (1

我希望整数数学可以将所有分数向下舍入。但这并没有发生——我到处都是一个错误,因为 5.999 最终变成了 6 而不是 5。

  1. 这种行为记录在哪里?
  2. 什么是最简单的解决方法来获得我预期的四舍五入?

(完整代码上下文:https://github.com/keybounce/Finite-Fluids/blob/master/src/main/java/com/mcfht/realisticfluids/Util.java

【问题讨论】:

  • 如果您实际除以div,而不是除以s,结果可能会有所不同。我的意思是,你确实创建了div,我想是有原因的。
  • s = 1 时,-8 除以s 为-8,-8 除以div (1s = 9时,-8除以s为0(从-0.8888889向下取整),-8除以div(1

标签: java integer rounding division truncation


【解决方案1】:

我希望整数数学能将所有小数四舍五入。

首先,你不是在做整数除法:你是在做浮点除法。 (float)-8 是一个浮点表达式。因此,(float)-8/s 中的 s 在除法发生之前被提升为 (float)。

然后将浮点结果转换为int。 Reuseman 说整数除法向零舍入。好吧,float->int 转换也向零舍入。

【讨论】:

  • Java 规范支持您的声明:JLS §5.1.3 ...浮点值四舍五入为整数值 V,使用 IEEE 754 向零舍入模式(@ 987654322@).
猜你喜欢
  • 1970-01-01
  • 2013-04-23
  • 1970-01-01
  • 2011-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多