java怎么设置bigdecimal值

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java怎么设置bigdecimal值相关的知识,希望对你有一定的参考价值。

1、java设置bigdecimal值的方法如下:

add(BigDecimal)        BigDecimal对象中的值相加,然后返回这个对象。 

subtract(BigDecimal) BigDecimal对象中的值相减,然后返回这个对象。 

multiply(BigDecimal)  BigDecimal对象中的值相乘,然后返回这个对象。 

divide(BigDecimal)     BigDecimal对象中的值相除,然后返回这个对象。 

toString()                将BigDecimal对象的数值转换成字符串。 

doubleValue()          将BigDecimal对象中的值以双精度数返回。 

floatValue()             将BigDecimal对象中的值以单精度数返回。 

longValue()             将BigDecimal对象中的值以长整数返回。 

intValue()               将BigDecimal对象中的值以整数返回。

【注意】由于一般数值类型,例如double,不能准确地代表16位有效数以上的数字,在使用BigDecimal时,应用BigDecimal(String)构造器创建对象才有意义。另外,BigDecimal所创建的是对象,我们不能使用传统的+、-、*、/等算术运算符直接对其对象进行数学运算,而必须调用其相对应的方法。方法中的参数也必须是BigDecimal的对象。

2、Java

Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。

Java可以编写桌面应用程序、Web应用程序、分布式系统和嵌入式系统应用程序等。

参考技术A 关于BigDecimal是如何计算的,我以论坛中一个人的提问帖子为例,来简单的写出BigDecimal的运算方法。题目是:李白无事街上走,提壶去买酒。遇店加一倍,见花喝一斗,五遇花和店,喝光壶中酒,试问李白壶中原有多少斗酒?
这道题应该是从后往前推,并且要逆运算,最后得出原有酒的体积。

?

import java.math.*
public class Libai
public static void main(String args[])
BigDecimal volumn = new BigDecimal("0");
for (int i=0; i<5; i++)
volumn = volumn.add(new BigDecimal("1"));
volumn = volumn.divide(new BigDecimal("2"));

System.out.print(volumn);



运行结果:
0.96875本回答被提问者和网友采纳
参考技术B BigDecimal loanAmount = new BigDecimal("1111.22");

将 double 转换为 BigDecimal 并设置 BigDecimal 精度

【中文标题】将 double 转换为 BigDecimal 并设置 BigDecimal 精度【英文标题】:Convert double to BigDecimal and set BigDecimal Precision 【发布时间】:2012-09-05 21:25:41 【问题描述】:

在 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 可以限制转换为字符串的精度吗?

【问题讨论】:

注意:BigDecimal 有时也会使用科学记数法(我相信数字 【参考方案1】:

这种行为的原因是打印的字符串是准确的值 - 可能不是你所期望的,但这是存储在内存中的真实值 - 这只是浮点表示的限制。

根据 javadoc,如果不考虑此限制,BigDecimal(double val) 构造函数的行为可能会出乎意料:

此构造函数的结果可能有些不可预测。一 可能会假设用 Java 编写 new BigDecimal(0.1) 会创建一个 BigDecimal 正好等于 0.1(未缩放的值 1,与 比例为 1),但实际上等于 0.10000000000000000055511151231257827021181583404541015625。这是因为 0.1 不能完全表示为双精度数(或者,对于 物质,作为任何有限长度的二进制分数)。因此,价值 传递给构造函数的不完全等于 0.1,尽管出现了。

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

double val = 77.48;
new BigDecimal(val);

使用

BigDecimal.valueOf(val);

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

【讨论】:

今天遇到了完全相同的问题,恕我直言,这是最合适的答案!谢谢! 我建议在BigDecimal.valueOf(val) 之后添加.stripTrailingZeros() 以省略尾随零。示例:BigDecimal.valueOf(15.0).stripTrailingZeros(); -> 15(如果您不调用 .stripTrailingZeros(),则不是 15.0@【参考方案2】:

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

BigDecimal b = new BigDecimal(d, MathContext.DECIMAL64);

只需选择您需要的上下文。

【讨论】:

不推荐使用双重构造函数。 ***.com/questions/1056722/… BigDecimal b = BigDecimal.valueOf(d); @rvazquezglez 喜欢你的解决方案 其他值仍然存在缺陷。例如new BigDecimal( 1E-11, MathContext.DECIMAL64).toPlainString() 打印0.000000000009999999999999999,但BigDecimal.valueOf 按预期工作。【参考方案3】:

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

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

BigDecimal b = new BigDecimal("47.48")

避免丢失任何精度。

【讨论】:

【参考方案4】:

为什么不:

b = b.setScale(2, RoundingMode.HALF_UP);

【讨论】:

为什么不 BigDecimal b = new BigDecimal(c).setScale(2,BigDecimal.ROUND_HALF_UP);【参考方案5】:

它正在打印出double 的实际准确值。

Double.toString(),将doubles 转换为Strings, 打印输入的确切十进制值——如果x 是您的双精度值,它会打印出足够的数字,x 是最接近它打印的值的double

关键是 没有像 47.48 这样的double。 Doubles 将值存储为 binary 分数,而不是小数,因此它不能存储精确的十进制值。 (这就是BigDecimal 的用途!)

【讨论】:

【参考方案6】:

String.format 语法帮助我们将双精度数和 BigDecimals 转换为任何精度的字符串。

这个java代码:

double dennis = 0.00000008880000d;
System.out.println(dennis);
System.out.println(String.format("%.7f", dennis));
System.out.println(String.format("%.9f", new BigDecimal(dennis)));
System.out.println(String.format("%.19f", new BigDecimal(dennis)));

打印:

8.88E-8
0.0000001
0.000000089
0.0000000888000000000

【讨论】:

【参考方案7】:
BigDecimal b = new BigDecimal(c).setScale(2,BigDecimal.ROUND_HALF_UP);

【讨论】:

【参考方案8】:

在 Java 9 中,以下内容已被弃用:

BigDecimal.valueOf(d).setScale(2, BigDecimal.ROUND_HALF_UP);

改为使用:

BigDecimal.valueOf(d).setScale(2, RoundingMode.HALF_UP);

例子:

    double d = 47.48111;

    System.out.println(BigDecimal.valueOf(d)); //Prints: 47.48111

    BigDecimal bigDecimal = BigDecimal.valueOf(d).setScale(2, RoundingMode.HALF_UP);
    System.out.println(bigDecimal); //Prints: 47.48

【讨论】:

以上是关于java怎么设置bigdecimal值的主要内容,如果未能解决你的问题,请参考以下文章

将 double 转换为 BigDecimal 并设置 BigDecimal 精度

如何打印格式化的 BigDecimal 值?

decimal 在JAVA里怎么表示?

BigDecimal使用@JsonSerialize序列化自定义格式

java中bigdecimal 类型的变量怎么相互加减乘除

怎么将BigDecimal转换成Int