我有一个接受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。
字符串和双值的大小数点不同,因此,精度损失发生。
发布于 2020-06-13 18:49:52
如果允许BigDecimal是算术的结果,这个想法就会崩溃。
如果要要求BigDecimal是十进制字符串转换的直接、未经修改的结果,那么在方法中要求字符串参数并将其转换为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 falsehttps://stackoverflow.com/questions/62346351
复制相似问题