首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >转换双BigDecimal并设置BigDecimal精度

转换双BigDecimal并设置BigDecimal精度
EN

Stack Overflow用户
提问于 2012-09-12 19:50:05
回答 7查看 306.6K关注 0票数 96

在Java中,我希望获得一个双值,并将其转换为BigDecimal,并将其字符串值打印到一定的精度。

代码语言:javascript
复制
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可以限制转换为字符串的精度吗?

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2012-09-12 19:57:52

如果使用另一个MathContext,它会打印47.48000

代码语言:javascript
复制
BigDecimal b = new BigDecimal(d, MathContext.DECIMAL64);

选择你需要的背景。

票数 66
EN

Stack Overflow用户

发布于 2013-05-27 13:24:34

出现这种行为的原因是,打印的字符串是确切的值--可能不是您预期的值,但这是存储在内存中的真正值--它只是浮点表示的限制。

根据javadoc,如果不考虑这个限制,BigDecimal(double val)构造函数行为可能是意外的:

此构造函数的结果可能有些不可预测。人们可能会假设用Java编写新的BigDecimal( 0.1 )会创建一个完全等于0.1的BigDecimal (非缩放值为1,刻度为1),但它实际上等于BigDecimal这是因为0.1不能被精确地表示为双(或者,就这一点而言,是任何有限长度的二进制分数)。因此,尽管外观如此,传递给构造函数的值并不完全等于0.1。

所以在你的情况下,而不是用

代码语言:javascript
复制
double val = 77.48;
new BigDecimal(val);

使用

代码语言:javascript
复制
BigDecimal.valueOf(val);

由BigDecimal.valueOf返回的值等于调用Double.toString(double)所产生的值。

票数 150
EN

Stack Overflow用户

发布于 2012-09-12 20:00:22

您想要尝试String.format("%f", d),它将以十进制表示法打印您的双份。根本不要使用BigDecimal

关于精度问题:您首先将47.48存储在double c中,然后从该double中生成一个新的BigDecimal。精度的损失在于分配给c。你可以

代码语言:javascript
复制
BigDecimal b = new BigDecimal("47.48")

以免失去任何精确性。

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

https://stackoverflow.com/questions/12395281

复制
相关文章

相似问题

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