首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么在用Java构造Double.toString时,MathContext.DECIMAL64的行为与BigDecimal不一样?

为什么在用Java构造Double.toString时,MathContext.DECIMAL64的行为与BigDecimal不一样?
EN

Stack Overflow用户
提问于 2013-10-17 16:01:57
回答 1查看 568关注 0票数 3

在我看来,Double应该遵循与MathContext.DECIMAL64中使用的IEEE标准相同的规则,但是,在这种情况下,我得到了不同的行为:

代码语言:javascript
复制
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)));

    }
}

输出:

代码语言:javascript
复制
8.699999999999999
8.7
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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位数的分裂。

示例代码

代码语言:javascript
复制
/**
     * @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)));

    }

输出

代码语言:javascript
复制
8.699999999999999
8.699999999999999
8.6999999999999993
9
8.7
8.70
8.70000000000000
8.7

更多信息- aboutBigDecimal和doubles on

bigdecimal

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19431689

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档