首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >验证是否创建了大十进制,而没有造成任何精度损失。

验证是否创建了大十进制,而没有造成任何精度损失。
EN

Stack Overflow用户
提问于 2020-06-12 14:27:11
回答 1查看 205关注 0票数 0

我有一个接受BigDecimal的方法。我想确保它的十进制值没有精度损失(即)输入到大小数点的准确存储。我的理解是,当我试图将无限大的双小数点转换为大小数点时,就会出现精度损失,因此,建议使用double的字符串表示来创建大小数点。基本上,我想确定是否使用BigDecimal(String)来构造这种无限倍的大小数。

根据我的理解,经过文档后,在大十进制转换过程中导致精度损失的输入双值总是有很大的大小,不适合于64位。例: 0.1。所以,这样大的小数的字符串和双值表示是不匹配的。如果说当字符串和双值不匹配时出现了精度损失,就足够了吗?

例:

BigDecimal十进制=新的BigDecimal(0.1);

0.1000000000000000055511151231257827021181583404541015625 System.out.println(decimal.toString()) // prints

System.out.println(decimal.doubleValue()) //打印0.1。

字符串和双值的大小数点不同,因此,精度损失发生。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-13 18:49:52

如果允许BigDecimal是算术的结果,这个想法就会崩溃。

如果要要求BigDecimal是十进制字符串转换的直接、未经修改的结果,那么在方法中要求字符串参数并将其转换为BigDecimal要简单得多。

下面的程序试图实现和测试您的有效性检查。变量third是在不涉及任何双数的情况下计算的,只使用十进制字符串和BigDecimal,但测试失败。

代码语言:javascript
复制
import java.math.BigDecimal;
import java.math.RoundingMode;

public strictfp class Test {
    public static void main(String[] args) {
        BigDecimal third = BigDecimal.ONE.divide(new BigDecimal("3"), 30, RoundingMode.HALF_EVEN);
        testIt(new BigDecimal("0.1"));
        testIt(new BigDecimal(0.1));
        testIt(third);
    }

    static void testIt(BigDecimal in) {
        System.out.println(in+" "+isValid(in));
    }

    static boolean isValid(BigDecimal in) {
        double d = in.doubleValue();
        String s1 = in.toString();
        String s2 = Double.toString(d);
        return s1.equals(s2);
    }
}

输出:

代码语言:javascript
复制
0.1 true
0.1000000000000000055511151231257827021181583404541015625 false
0.333333333333333333333333333333 false
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62346351

复制
相关文章

相似问题

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