当前位置:首页 > Java技术 > new BigDecimal(0.01) 与 new BigDecimal(String.valueOf(0.01))的区别 (转)

new BigDecimal(0.01) 与 new BigDecimal(String.valueOf(0.01))的区别 (转)

2022年09月16日 09:42:39Java技术4

转自:http://blog.csdn.net/major1985/article/details/50210293

 

一般我们使用BigDecimal进行比较精密的计算,我这里计算金额。注意使用double构造器的本质与String构造的本质,避免造成问题。

我这里出现的问题是金额总是多了0.01

问题出现在这段代码:

if(valueDiffDays > 0){
            logger.info("该账单{}需要缴纳{}天利息",loanBillLogDO.getBillSeqNo(),valueDiffDays);
            interestAmt = repayAmt * interestDayRate * valueDiffDays;
            loanBillLogDO.setInterestAmt(new BigDecimal(interestAmt).setScale(2, RoundingMode.UP));

        }

应该是0.80的总是变成0.81,进行断点调试发现interestAmt的值是0.8.

进行测试:

 @Test
    public void testBigDecimalMode(){
        double dayRate = 0.08;
        double amt = 1000;
        int diff = 1;

        double interestAmt = amt*dayRate/100*diff;
        BigDecimal tInterestAmt = new BigDecimal(interestAmt).setScale(2 , RoundingMode.UP);
        System.out.println(interestAmt);
        System.out.println(tInterestAmt);

        BigDecimal a = new BigDecimal("0.8");
        System.out.println(a.setScale(2, RoundingMode.UP));
        BigDecimal b = new BigDecimal(0.8);
        System.out.println(b.setScale(2 , RoundingMode.UP));
//        loanBillLogDO.setInterestAmt(new BigDecimal(interestAmt).setScale(2, RoundingMode.UP));
    }

基本确定BigDecimal的double构造存在问题,String构造不存在问题。

 

api说明:

 new BigDecimal(0.01) 与 new BigDecimal(String.valueOf(0.01))的区别 (转) _ JavaClub全栈架构师技术笔记

BigDecimal

public BigDecimal(String val)
将 BigDecimal 的字符串表示形式转换为 BigDecimal。字符串表示形式由可选符号 '+' ( '\u002B') 或 '-' ( '\u002D') 组成,后跟零或多个十进制数字(“整数”)的序列,可以选择后跟一个小数,也可以选择后跟一个指数。
该小数由小数点以及后跟的零或更多十进制数字组成。字符串必须至少包含整数或小数部分中的一个数字。由符号、整数和小数部分组成的数字称为有效位数。

指数由字符 'e''\u0065') 或 'E' ('\u0045') 以及后跟的一个或多个十进制数字组成。指数的值必须位于 Integer.MAX_VALUE (Integer.MIN_VALUE+1) 和 Integer.MAX_VALUE(包括)之间。

更正式地说,以下语法描述了此构造方法接受的字符串:

BigDecimalString:
Signopt Significand Exponentopt
Sign:
+
-
Significand:
IntegerPart . FractionPartopt
. FractionPart
IntegerPart
IntegerPart:
Digits
FractionPart:
Digits
Exponent:
ExponentIndicator SignedInteger
ExponentIndicator:
e
E
SignedInteger:
Signopt Digits
Digits:
Digit
Digits Digit
Digit:
Character.isDigit(char) 对其返回 true 的任何字符,如 012……
返回的 BigDecimal 的标度将是小数部分中的数字位数,如果该字符串不包含小数点,则标度为零,这取决于对指数的调整;如果字符串包含一个指数,则从标度减去该指数。得到的标度值必须位于 Integer.MIN_VALUE 和 Integer.MAX_VALUE(包括)之间。

Character.digit(char, int) 集提供从字符到数字的映射,以转换成基数 10。该字符串不能包含任何额外字符(例如,空白)。

示例:
返回的 BigDecimal 的值等于有效位数 × 10 指数。对于左边的每个字符串,得到的表示形式 [BigInteger, scale] 显示在右边。

 "0"            [0,0]
 "0.00"         [0,2]
 "123"          [123,0]
 "-123"         [-123,0]
 "1.23E3"       [123,-1]
 "1.23E+3"      [123,-1]
 "12.3E+7"      [123,-6]
 "12.0"         [120,1]
 "12.3"         [123,1]
 "0.00123"      [123,5]
 "-1.23E-12"    [-123,14]
 "1234.5E-4"    [12345,5]
 "0E+7"         [0,-7]
 "-0"           [0,0]
 
注:对于不是 floatdouble NaN 和 ±Infinity 的值,此构造方法与 Float.toString(float) 和 Double.toString(double) 返回的值兼容。这通常是将 floatdouble 转换为 BigDecimal 的首选方法,因为它不会遇到 BigDecimal(double) 构造方法的不可预知问题。

参数:
val - BigDecimal 的字符串表示形式。
抛出:
NumberFormatException - 如果 val 不是 BigDecimal 的有效表示形式。

 

 

new BigDecimal(0.01) 与 new BigDecimal(String.valueOf(0.01))的区别 (转) _ JavaClub全栈架构师技术笔记

 

作者:guodaxia
来源链接:https://www.cnblogs.com/aigeileshei/p/6860909.html

版权声明:
1、JavaClub(https://www.javaclub.cn)以学习交流为目的,由作者投稿、网友推荐和小编整理收藏优秀的IT技术及相关内容,包括但不限于文字、图片、音频、视频、软件、程序等,其均来自互联网,本站不享有版权,版权归原作者所有。

2、本站提供的内容仅用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯相关权利人及本网站的合法权利。
3、本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站(javaclubcn@163.com),我们将第一时间核实后及时予以删除。


本文链接:https://www.javaclub.cn/java/41711.html

标签: BigDecimal
分享给朋友:

“new BigDecimal(0.01) 与 new BigDecimal(String.valueOf(0.01))的区别 (转)” 的相关文章

java.math.BigDecimal常用方法

+构造函数 BigDecimal(BigInteger val) 将BigInteger转化为BigDecimal。 BigDecimal(BigInteger unscaledVal, int scale) 将B...

Java 使用BigDecimal进行高精度加减乘除

有时候我们计算金钱或者其他一些计算的时候需要高精度的计算加减乘除,可以使用BigDecimal 加: BigDecimal num1 = new BigDecimal("100.569"); BigDecimal num2 = new Big...

[转]BigDecimal使用(整理)

原文地址:https://www.jianshu.com/p/2947868d76eb 应用场景 大多数的商业计算中,一般采用java.math.BigDecimal类来进行精确计算。比如:货币 使用 1、构建BigDecima...

Java:利用BigDecimal类巧妙处理Double类型精度丢失

Java:利用BigDecimal类巧妙处理Double类型精度丢失

文章目录 本篇要点 经典问题:浮点数精度丢失 十进制整数如何转化为二进制整数? 十进制小数如何转化为二进制数?...

【java提高】(19)---BigDecimal详解和精度问题

【java提高】(19)---BigDecimal详解和精度问题

BigDecimal详解和精度问题 一、背景 在实际开发中,对于 不需要任何准确计算精度的属性可以直接使用float或double,但是如果需要精确计算结果,则必须使用BigDecimal,例如价格、质量。 为什么这么说,主要有两点...

BigDecimal去除小数位

String cellValue = ""; double numericCellValue = cell.getNumericCellValue(); BigDecimal bd2...

java定义Bigdecimal类型

Java常用类型定义、转换及比较主要有以下三个方面: (一)Integer类型 1).定义 Integer a=new Integer(int value); Integer a=new Integer(String value); 2).转换 i.定义中就可以将int...

BigDecimal 百分比转换

public static void main(String[] args) { BigDecimal bigDecimalCount = BigDecimal.valueOf(1); BigDecimal bigDecimalTotal...

Java BigDecimal详解

原文地址:http://blog.csdn.net/jackiehff/article/details/8582449#comments 1.引言         借用《...

关于BigDecimal与Double

关于BigDecimal与Double

BigDecimal与double 前几天,系统处理double类型的加减法,出现问题。 请看题: 示例1 问, 结果是多少? 0.01? No! 结果是0.00999999999999999...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。