hal*_*ber 7 java rounding bigdecimal divide
有人可以解释为什么第一行的结果为0?
System.out.println((new BigDecimal("1.0E+8")).divide(new BigDecimal(100000000), BigDecimal.ROUND_HALF_UP));
System.out.println((new BigDecimal("1.0E+8")).subtract(BigDecimal.ONE).divide(new BigDecimal(100000000), BigDecimal.ROUND_HALF_UP));
0E+7
1
Run Code Online (Sandbox Code Playgroud)
rge*_*man 13
这一切都与做秤的的BigDecimal介入秒.
当您在构造函数中String指定带有a的指数格式时,比例可能为负.这表明有效数字不会一直延伸到单位.
BigDecimal oneEPlus8 = new BigDecimal("1.0E+8");
System.out.println(oneEPlus8.scale());
Run Code Online (Sandbox Code Playgroud)
这输出-7.
使用构造函数,其int得到的缩放比例为0.
BigDecimal oneHundredMillion = new BigDecimal(100000000);
System.out.println(oneHundredMillion.scale());
Run Code Online (Sandbox Code Playgroud)
这输出0.
当你divide BigDecimalš,商需要在其上对象的比例divide被调用.因此,商的规模也是-7.计算得到的结果是1,但是在-7舍入范围内,只提供了两个选项:0或者10000000,舍入ROUND_HALF_UP为0,给出输出0E+7.
当你使用subtract BigDecimals时,差异取最大值减去的数字.所以,差异的规模是0.计算结果为1,并且0此处的比例不强制舍入.输出是1.
为了得到结果1,而无需减1,你可以减去0,或者也可以称之为setScale(0)上oneEPlus8.
oneEPlus8 = oneEPlus8.setScale(0);
System.out.println(oneEPlus8.divide(oneHundredMillion, BigDecimal.ROUND_HALF_UP));
Run Code Online (Sandbox Code Playgroud)
这输出:
1
Run Code Online (Sandbox Code Playgroud)
另外,您可以使用divide(BigDecimal, RoundingMode)除以指定RoundingMode枚举而不是旧int常量.