首页 > 其他分享 >BigDecimal处理Double类型精度问题

BigDecimal处理Double类型精度问题

时间:2023-12-05 18:02:51浏览次数:40  
标签:BigDecimal val 0.1 Double valueOf double new 精度

最近发现工程里出现金额精度问题,记录下使用区别:

    public static void main(String[] args) {
        Double  a = 0.1;
        BigDecimal b = new BigDecimal(a);
        BigDecimal c = BigDecimal.valueOf(a);
        System.out.println("b is :"+b);
        System.out.println("c is :"+c);
    }

b is :0.1000000000000000055511151231257827021181583404541015625

c is :0.1


问题点:new BigDecimal(double val)

这个方法是不可预测的,以 0.1 为例,如 double 类型的值为 0.1,最后不会返回一个值为 0.1 的 BigDecimal,为什么?原因在于 0.1 无法用有限长度的二进制数表示,无法精确地表示为双精度数,最后的结果会是 0.000110011001…。

解决方案:

1、推荐使用 new BigDecimal(String val)

2、直接使用静态方法 BigDecimal.valueOf(double val)


note

可以直接点构造参数进去查看原有的源码注释,这些问题其实之前是已经注释过的

BigDecimal处理Double类型精度问题_精度问题

标签:BigDecimal,val,0.1,Double,valueOf,double,new,精度
From: https://blog.51cto.com/u_12929241/8694724

相关文章

  • 【C语言基础】float、double 浮点数类型的四舍五入问题
    简短不看版:C语言中,不能进行doublea==doubleb 这样的运算。另外,printf(".1f",&double)的时候,数据输出不同时候,可能会不一样。根本问题时float类型或者double类型的浮点数在计算机中不能精确储存。              单精度浮点型(float)存储方式比如,若我们希......
  • bigdecimal保留两位小数
    1 publicclasstest1_format{2 publicstaticvoidmain(String[]args){3 BigDecimaldecimal=newBigDecimal("1.12345");4 System.out.println(decimal);5 BigDecimalsetScale=decimal.setScale(4,BigDecimal.ROUND_HALF_DOWN);6 Syste......
  • Java之API详解之BigDecimal类的详细解析
     7BigDecimal类7.1引入首先我们来分析一下如下程序的执行结果:publicclassBigDecimalDemo01{publicstaticvoidmain(String[]args){System.out.println(0.09+0.01);}}这段代码比较简单,就是计算0.09和0.01之和,并且将其结果在控制台进行输出。那么......
  • Add double quotes to surrounding a word/text
    InVIMforVScode,howtoaddapairofdoubleorsinglequotestosurroundanexistingword/text/numebr?I'vebeenwritingRcodeswithVScodeformanyyears(ThankstotheawesomeRpluginforVScode!).Sometimes,I'llcreateasetofcharacte......
  • 【JavaSE】一些常见API(Object、Objects、Math、System、BigDecimal、包装类、Arrays)
    Object类Object类介绍toString方法直接println(对象名),默认会自动调用(对象名.toString),而.toString默认是返回地址信息->全类名(包名+类名)@地址的十六进制哈希值,因此如果println(对象名)控制台没有输出地址值,说明该类一定重写了Object类的toString方法,比如String类和Arr......
  • ABAP 7.58 中支持任意精度算数的新类
    1.引言通常,有两种对编程语言的改进。第一种是让困难的事情变得简单,第二种是让不可能的事情变为可能。本文介绍的是任意精度算术,它属于第二类:使在ABAP中原本不可能的事情成为可能。过去已经可以在ABAP中使用INT8或DECFLOAT34数据类型进行非常大的数字计算,但还不能进行任意精度的......
  • js精度丢失的问题,利用lodash函数库重新封装
    functionroundAndPad(num,decimalPlaces){  varrounded=_.round(num,decimalPlaces); //使用Lodash的_.round函数四舍五入  varstr=rounded.toString();  vardecimalIndex=str.indexOf('.');  console.log("str:",str);  console.lo......
  • 高精度模板
    高精度加法#include<bits/stdc++.h>usingnamespacestd;constintL=11010;stringadd(stringa,stringb)//只限两个非负整数相加{ stringans; intna[L]={0}; intnb[L]={0}; intla=a.size(); intlb=b.size(); for(inti=0;i<la;i++)na[la......
  • C# double decimal 四舍五入
    传送门usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;publicclassProgram{publicstaticvoidMain(){//先看看double类型通过Math.Round取两位小数得到什么Console.WriteLine(Math.Round(2.345d,2));//2.35//再看看de......
  • 高精度算法总结
    高精度加法题目链接:https://www.acwing.com/activity/content/problem/content/825/代码模版:1#include<iostream>2#include<vector>34usingnamespacestd;56//C=A+B7vector<int>add(vector<int>&A,vector<int>&......