在我看来,Double应该遵循与MathContext.DECIMAL64中使用的IEEE标准相同的规则,但是,在这种情况下,我得到了不同的行为:
import java.math.BigDecimal;
import java.math.MathContext;
public class BigDecimalTest {
public static void main(String[] args) {
double foo = 8.7;
System.out.println(new BigDecimal(foo, MathContext.DECIMAL64));
System.out.println(new BigDecimal(Double.toString(foo)));
}
}输出:
8.699999999999999
8.7发布于 2013-10-17 17:07:44
BigDecimal任意精度有符号的十进制数.另一方面,双则是一个浮点数,因此它意味着对所表示的数字有某种印象。
当您尝试从double创建一个大小数点时,您将得到由double表示的值,在您的示例中这个值是8.699999999999999。原因是双变量实际上不能保持8.7。关于大小数的更多信息
http://goo.gl/tRMLhA
当您将数字表示为字符串时,"8.7“值将由to String方法返回,并连续地将该值签名到大十进制。方法toString使用一些rools将双值表示为字符串。
http://docs.oracle.com/javase/7/docs/api/java/lang/Double.html#toString(double)&bwsCriterion=toString&bwsMatch=3
当你使用MathContext.DECIMAL64时,你会说:“好吧,我知道双数有一些不完善之处,所以我想让你用16位数的预加数和圆周模式进行四舍五入”,这正是你得到的。Java采用8.7的双重表示,即8.6999999999999993,并将其舍入16位数,结果是8.699999999999999,因为数字17是"3“,因此舍入一半的结果是留下数字16,因为它是9。
关于MathContext.DECIMAL64的含义的信息:http://goo.gl/fVUehh
如果你想得到8.7,只需使用一个小于16位数的分裂。
示例代码
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
double foo = 8.7;
System.out.println(new BigDecimal(foo, MathContext.DECIMAL64));
System.out.println(new BigDecimal(foo, new MathContext(16)));
System.out.println(new BigDecimal(foo, new MathContext(17)));
System.out.println(new BigDecimal(foo, new MathContext(1)));
System.out.println(new BigDecimal(foo, new MathContext(2)));
System.out.println(new BigDecimal(foo, new MathContext(3)));
System.out.println(new BigDecimal(foo, new MathContext(15)));
System.out.println(new BigDecimal(Double.toString(foo)));
}输出
8.699999999999999
8.699999999999999
8.6999999999999993
9
8.7
8.70
8.70000000000000
8.7更多信息- aboutBigDecimal和doubles on
https://stackoverflow.com/questions/19431689
复制相似问题