验证是否在没有任何精度损失的情况下创建了大十进制。

问题描述 投票:0回答:1

我有一个接受BigDecimal的方法。我想确保它的十进制值没有精度损失(即)输入到大十进制的值完全按照它的原样存储。我的理解是,当我试图将无限双数转换为大十进制时,会发生精度损失,因此,建议使用double的字符串表示来创建大十进制。基本上,我想确认一下,对于这样的无限双数,是否可以使用BigDecimal(String)来构造大十进制。

根据我的理解,在经历了 文档在大十进制转换过程中造成精度损失的输入双值总是有非常大的幅度,无法适应64位。例如:0.1。那么,这样的大小数的字符串和双倍值的表示方式是不匹配的,当字符串和双倍值不匹配时,是否可以说已经出现了精度损失?Eg: BigDecimal decimal = new BigDecimal(0.1); System.out.println(decimal.toString()) /打印0.1000000000000000055511151231257827021181583404541015625 System.out.println(decimal.doubleValue()) /打印0.1。字符串和大十进制的双倍值不同,所以发生了精度损失。

double bigdecimal
1个回答
0
投票

如果你允许BigDecimal是算术的结果,这个想法就会被打破。

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

下面的程序是一个实现和测试有效性检查的尝试。变量 third 在没有任何双数参与的情况下,仅使用十进制字符串和BigDecimal进行计算,但未能通过测试。

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);
    }
}

输出。

0.1 true
0.1000000000000000055511151231257827021181583404541015625 false
0.333333333333333333333333333333 false
© www.soinside.com 2019 - 2024. All rights reserved.