我发现DecimalFormatjava 7和java 8之间的类舍入不一致.这是我的测试用例:
import java.text.DecimalFormat;
public class DecimalFormatTest {
public static void main(String[] args) {
DecimalFormat format = (DecimalFormat) DecimalFormat.getInstance();
format.setDecimalSeparatorAlwaysShown(true);
format.setMinimumFractionDigits(1);
format.setMaximumFractionDigits(1);
System.out.println(format.format(83.65));
}
}
Run Code Online (Sandbox Code Playgroud)
在Java(TM)SE运行时环境(版本1.7.0_51-b13)中,输出为:
83.6
Run Code Online (Sandbox Code Playgroud)
在Java(TM)SE运行时环境(版本1.8.0-b132)中,输出为:
83.7
Run Code Online (Sandbox Code Playgroud)
这是一个回归错误吗?或者随着Java 8的发布,舍入规则发生了变化?
根据我的理解,使用半偶数舍入,如果您正在舍入的数字在其邻居之间是等距的(例如,如果您在十进制之后的四舍五入,则为4.5),则将前一个数字舍入到最接近的偶数.
例如,如果您在十进制1.5,3.5,5.5,7.5和9.5之后舍入到0位,则将分别向上舍入为2,4,6,8和10.这一切在netbeans中运行良好,但是当我在小数点后舍入到1位时遇到问题.
package foo;
import java.text.NumberFormat;
public class Foo {
public static void main(String[] args) {
NumberFormat formatter = NumberFormat.getNumberInstance();
formatter.setMaximumFractionDigits(1);
System.out.print(formatter.format(4.45));
}
}
Run Code Online (Sandbox Code Playgroud)
跑:
4.5
BUILD SUCCESSFUL (total time: 0 seconds)
Run Code Online (Sandbox Code Playgroud)
我认为这将会达到4.4
另外,如果我使用4.55输入格式,4.5输出我期望4.6是否有错误的java或我的理解?
我正在尝试实现一个新的等级舍入到BigDecimal类,我得到一个可能的错误,我可能做错了.下面的代码暴露了我的问题:
public static void main(String[] args) throws IOException {
BigDecimal valDouble = new BigDecimal(0.35);
valDouble = valDouble.setScale(1, BigDecimal.ROUND_HALF_UP);
System.out.println(valDouble.doubleValue()); // prints 0.3
BigDecimal valString = new BigDecimal(new String("0.35"));
valString = valString.setScale(1, BigDecimal.ROUND_HALF_UP);
System.out.println(valString.doubleValue()); // prints 0.4
}
Run Code Online (Sandbox Code Playgroud)
我的疑问是,BigDecimal与double和String构造函数有什么不同?
我无法理解这个'bug',至少,我只是用一个简单的字符串concat来"解决"它,如下所示:
BigDecimal valDouble = new BigDecimal("" + 0.35);
Run Code Online (Sandbox Code Playgroud)
什么可能导致这种奇怪的行为?