Java 你能解释一下DecimalFormatAPI的输出吗?
我有一个有价值的数字 0.947 现在,我将java.text的DecimalFormat API与以下模式和RoundingMode一起使用-Java 你能解释一下DecimalFormatAPI的输出吗?,java,escaping,Java,Escaping,我有一个有价值的数字 0.947 现在,我将java.text的DecimalFormat API与以下模式和RoundingMode一起使用- double numberToFormat = 0.947; DecimalFormat restrictTo1DecimalPlace = new DecimalFormat("0.0%"); restrictTo1DecimalPlace.setRoundingMode(RoundingMode.DOWN); String formatte
double numberToFormat = 0.947;
DecimalFormat restrictTo1DecimalPlace = new DecimalFormat("0.0%");
restrictTo1DecimalPlace.setRoundingMode(RoundingMode.DOWN);
String formattedString = restrictTo2DecimalPlace.format(numberToFormat);
现在,我希望formattedString的值是94.7%,但它的值是94.6%。
我知道该值已设置为RoundMode.Down,但为什么下面的值不向下舍入-
0.9471 -> 94.7%
0.9447 -> 94.4%
最接近0.947的浮点数实际上是
0.94699999999999995292654375589336268603801727294921875
这是您的计算机在写入0.947时存储为双精度的内容
四舍五入得到94.6%
恐怕这就是生活。如果您想要精确的十进制行为,请使用十进制类型!请参见与0.947最接近的浮点数实际上是
0.94699999999999995292654375589336268603801727294921875
这是您的计算机在写入0.947时存储为双精度的内容
四舍五入得到94.6%
恐怕这就是生活。如果您想要精确的十进制行为,请使用十进制类型!请参见检查此链接。它已经解释清楚了。我不知道,可能我还需要更好地理解舍入,但我想问的是,为什么0.9471的值是94.7%,而不是94.6%,就像前面的例子一样。你需要更好地理解的不是舍入,而是浮点数的行为。检查这个链接。它已经解释清楚了检查过了,我还不知道可能我需要更好地理解四舍五入,但我想问的是为什么0.9471的值是94.7%,而不是94.6%,就像前面的问题示例,不是四舍五入,你需要更好地理解,但是浮点数的行为。如果你想要精确的十进制行为,那么就使用十进制类型!你能详细解释一下吗?@Vishal:我已经添加了一个SO问题的链接,其中包含了更多关于这个问题的信息。@Aaron:但一定要小心使用字符串构造函数来生成BigDecimal,否则你就回到了开始的地方。@Bathsheba我避免了用双精度构造BigDecimal,这可能会有问题。是否首选使用字符串构造函数而非双十进制算术?我几乎从不使用它们,所以我真的不知道最好的practices@Aaron:我也不使用BigDecimal-作为一名科学程序员,我对二进制浮点非常满意。如果您想要精确的十进制行为,请使用十进制类型!你能详细解释一下吗?@Vishal:我已经添加了一个SO问题的链接,其中包含了更多关于这个问题的信息。@Aaron:但一定要小心使用字符串构造函数来生成BigDecimal,否则你就回到了开始的地方。@Bathsheba我避免了用双精度构造BigDecimal,这可能会有问题。是否首选使用字符串构造函数而非双十进制算术?我几乎从不使用它们,所以我真的不知道最好的practices@Aaron:我也不使用BigDecimal——作为一名科学程序员,我对二进制浮点非常满意。