在Java中,我希望获得一个双值,并将其转换为BigDecimal,并将其字符串值打印到一定的精度。
import java.math.BigDecimal;
public class Main {
public static void main(String[] args) {
double d=-.00012;
System.out.println(d+""); //This prints -1.2E-4
double c=47.48000;
BigDecimal b = new BigDecimal(c);
System.out.println(b.toString());
//This prints 47.47999999999999687361196265555918216705322265625
}
}它打印出这个巨大的东西:
47.47999999999999687361196265555918216705322265625
而不是
47.48
我进行BigDecimal转换的原因是,有时双值将包含许多十进制位(即-.000012),而当将双值转换为字符串时,将产生科学的表示法-1.2E-4。我想用非科学符号存储字符串值。
我希望BigDecimal总是有两个精度单位:"47.48“。BigDecimal可以限制转换为字符串的精度吗?
发布于 2012-09-12 19:57:52
如果使用另一个MathContext,它会打印47.48000
BigDecimal b = new BigDecimal(d, MathContext.DECIMAL64);选择你需要的背景。
发布于 2013-05-27 13:24:34
出现这种行为的原因是,打印的字符串是确切的值--可能不是您预期的值,但这是存储在内存中的真正值--它只是浮点表示的限制。
根据javadoc,如果不考虑这个限制,BigDecimal(double val)构造函数行为可能是意外的:
此构造函数的结果可能有些不可预测。人们可能会假设用Java编写新的BigDecimal( 0.1 )会创建一个完全等于0.1的BigDecimal (非缩放值为1,刻度为1),但它实际上等于BigDecimal这是因为0.1不能被精确地表示为双(或者,就这一点而言,是任何有限长度的二进制分数)。因此,尽管外观如此,传递给构造函数的值并不完全等于0.1。
所以在你的情况下,而不是用
double val = 77.48;
new BigDecimal(val);使用
BigDecimal.valueOf(val);由BigDecimal.valueOf返回的值等于调用Double.toString(double)所产生的值。
发布于 2012-09-12 20:00:22
您想要尝试String.format("%f", d),它将以十进制表示法打印您的双份。根本不要使用BigDecimal。
关于精度问题:您首先将47.48存储在double c中,然后从该double中生成一个新的BigDecimal。精度的损失在于分配给c。你可以
BigDecimal b = new BigDecimal("47.48")以免失去任何精确性。
https://stackoverflow.com/questions/12395281
复制相似问题