Java中new BigDecimal()的坑

先看一段代码示例:

System.out.println(new BigDecimal(0.99));
System.out.println(new BigDecimal("0.99"));
System.out.println(BigDecimal.valueOf(0.99));
System.out.println(new BigDecimal(Double.valueOf(0.99)));
System.out.println(new BigDecimal(Double.valueOf(0.99).toString()));

输出结果如下:

0.9899999999999999911182158029987476766109466552734375
0.99
0.99
0.9899999999999999911182158029987476766109466552734375
0.99

可以看到new BigDecimal(double)类型时,小数的精度出现扩展。
总结:
如果使用new BigDecimal()时,尽可能转换为String,或者直接使用BigDecimal.valueof(double)

原文地址:https://blog.51cto.com/12012821/2385017

时间: 2024-07-31 23:40:12

Java中new BigDecimal()的坑的相关文章

Java中四则运算的那些坑

使用Java开发多年,感觉自己的水平也在不断提升,但是被Java狂虐却从来都没变过,而且任何一个Java的小角落,都能把我虐的体无完肤,但是无奈要靠Java吃饭,还得恬着脸继续使用下去.说说最近遇到的问题,则于新工作属于互联网金融,所以里面涉及到了大量的资金计算,资金计算对数字要求的比较严谨,作为一个粗心而又自大的Java程序员,一直没把这个当回事儿,于是又被Java吊打一遍.下面记录一下Java中四则运算的一些需要注意的小坑. 数学计算,免不了要想到 int long double 这种数据类

Java 中浮点数---------BigDecimal和double(初探)

为什么要使用 bigdecimal? 借用<Effactive Java>这本书中的话,float和double类型的主要设计目标是为了科学计算和工程计算.他们执行二进制浮点运算,这是为了在广域数值范围上提供较为精确的快速近似计算而精心设计的.然而,它们没有提供完全精确的结果,所以不应该被用于要求精确结果的场合.但是,商业计算往往要求结果精确,这时候BigDecimal就派上大用场啦. BigDecimal简介 BigDecimal 由任意精度的整数非标度值 和32 位的整数标度 (scale

Java中的BigDecimal类用法介绍

Java中提供了大数字(超过16位有效位)的操作类,即 java.math.BinInteger 类和 java.math.BigDecimal 类,用于高精度计算. 其中 BigInteger 类是针对大整数的处理类,而 BigDecimal 类则是针对大小数的处理类. BigDecimal 类的实现用到了 BigInteger类,不同的是 BigDecimal 加入了小数的概念. float和Double只能用来做科学计算或者是工程计算;在商业计算中,对数字精度要求较高,必须使用 BigIn

货币金额的计算 - Java中的BigDecimal

float和double只能用来做科学计算或者是工程计算,在商业计算中我们要用 java.math.BigDecimal.,而且使用BigDecimal类也可以进行大数的操作.具体参见API 编号 方法 类型 描述 1 public BigDecimal(double val)   构造 将double表示形式转化为BigDecimal 2 public BigDecimal(int val)  构造 将int表示形式转化为BigDecimal 3 public BigDecimal(Strin

Java中的Bigdecimal类型运算

双精度浮点型变量double可以处理16位有效数.在实际应用中,需要对更大或者更小的数进行运算和处理.Java在java.math包中提 供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算.表5.7中列出了BigDecimal类的主要构造器和方法. 构造器  描 述 BigDecimal(int)创建一个具有参数所指定整数值的对象. BigDecimal(double)创建一个具有参数所指定双精度值的对象. BigDecimal(long)创建一个具有参数所指定长整数值的

货币金额-Java中的BigDecimal

对于不需要任何准确计算精度的数字可以直接使用float或double,但是如果需要精确计算的结果,则必须使用BigDecimal类,而且使用BigDecimal类也可以进行大数的操作. float和double只能用来做科学计算或者是工程计算,在商业计算中金额我们要用 java.math.BigDecimal. 表11-15 BigDecimal类的常用方法 序号 方    法 类型 描    述 1 public BigDecimal(double val) 构造 将double表示形式转换

Java中关于 BigDecimal 的一个导致double精度损失的&quot;bug&quot;

背景 在博客 恶心的0.5四舍五入问题 一文中看到一个关于 0.5 不能正确的四舍五入的问题.主要说的是 double 转换到 BigDecimal 后,进行四舍五入得不到正确的结果: public class BigDecimalTest { public static void main(String[] args){ double d = 301353.05; BigDecimal decimal = new BigDecimal(d); System.out.println(decima

java中的BigDecimal和String的相互转换

1 /*由数字字符串构造BigDecimal的方法 2 02.*设置BigDecimal的小数位数的方法 3 03.*/ 4 04.import java.math.BigDecimal; 5 05.//数字字符串 6 06.String StrBd="1048576.1024"; 7 07.//构造以字符串内容为值的BigDecimal类型的变量bd 8 08.BigDecimal bd=new BigDecimal(StrBd); 9 09.//设置小数位数,第一个变量是小数位数,

mysql对应java中常用的字段

varchar 不定长字符串 字符串或是没有合适类型时,可以选择它作为字段类型 对应Java中的String int bigint 数值 一般以int作为数字的默认选择,数值很大时使用bigint 对应Java中的Long char 定长字符串 适用于盐.md5加密后的密码等情况 对应Java中的String float double 浮点数 适用于各种小数,除非金额等情况,小数推荐使用double 各自对应Java中的Float,Double decimal 精确浮点数 适用于金额 对应Jav