精华内容
下载资源
问答
  • 2022-03-31 12:10:46

    ​我最近在公司遇到了一个bug,因为项目中涉及到了和金额相关的业务,所以就接触到了 BigDecimal 高精度类型,在处理BUG中遇到了丢失精度的问题,又因为这涉及到钱的问题,不能忽视;

    double是什么?

    双精度浮点型,此数据类型与单精度数据类型(float)相似,但精确度比float高,编译时所占的内存空间依不同的编译器而有所不同,是double float数据类型,C/C++中表示实型变量的一种变量类型。

    decimal是什么?

    Decimal可用来保存具有小数点而且数值确定的数值,它不像floatreal是用来保存近似值。 [1]  对于Visual Basic而言,Decimal是其版本5新增的数据类型,目的是满足进行精密数学运算的需求,它是范围最大、最精确的浮点数类型。 [2]  

    更多相关内容
  • Double转换成BigDecimal进行运算

    千次阅读 2019-10-18 17:51:46
    由于double进行加减乘除运算容易丢失精度,所以一般把double转换成BigDecimal进行调用BigDecimal的加减乘除方法进行运算之后在转double类型 BigDecimal bignum1 = new BigDecimal("10"); BigDecimal bignum2 = ...

    由于double进行加减乘除运算容易丢失精度,所以一般把double转换成BigDecimal进行调用BigDecimal的加减乘除方法进行运算之后在转成double类型

    BigDecimal bignum1 = new BigDecimal("10");  
    BigDecimal bignum2 = new BigDecimal("5");  
    BigDecimal bignum3 = null;  
      
    //加法  
    bignum3 =  bignum1.add(bignum2);       
    System.out.println("和 是:" + bignum3);  
      
    //减法  
    bignum3 = bignum1.subtract(bignum2);  
    System.out.println("差  是:" + bignum3);  
      
    //乘法  
    bignum3 = bignum1.multiply(bignum2);  
    System.out.println("积  是:" + bignum3);  
      
    //除法  
    bignum3 = bignum1.divide(bignum2);  
    System.out.println("商  是:" + bignum3);
    

    double类型转化成 BigDecimal 类型进行 加减乘除

    public class Arith {
        /**
         * 提供精确加法计算的add方法
         * @param value1 被加数
         * @param value2 加数
         * @return 两个参数的和
         */
        public static double add(double value1,double value2){
            BigDecimal b1 = new BigDecimal(Double.valueOf(value1));
            BigDecimal b2 = new BigDecimal(Double.valueOf(value2));
            return b1.add(b2).doubleValue();
        }
         
        /**
         * 提供精确减法运算的sub方法
         * @param value1 被减数
         * @param value2 减数
         * @return 两个参数的差
         */
        public static double sub(double value1,double value2){
            BigDecimal b1 = new BigDecimal(Double.valueOf(value1));
            BigDecimal b2 = new BigDecimal(Double.valueOf(value2));
            return b1.subtract(b2).doubleValue();
        }
         
        /**
         * 提供精确乘法运算的mul方法
         * @param value1 被乘数
         * @param value2 乘数
         * @return 两个参数的积
         */
        public static double mul(double value1,double value2){
            BigDecimal b1 = new BigDecimal(Double.valueOf(value1));
            BigDecimal b2 = new BigDecimal(Double.valueOf(value2));
            return b1.multiply(b2).doubleValue();
        }
         
        /**
         * 提供精确的除法运算方法div
         * @param value1 被除数
         * @param value2 除数
         * @param scale 精确范围
         * @return 两个参数的商
         * @throws IllegalAccessException
         */
        public static double div(double value1,double value2,int scale) throws IllegalAccessException{
            //如果精确范围小于0,抛出异常信息
            if(scale<0){        
                throw new IllegalAccessException("精确度不能小于0");
            }
            BigDecimal b1 = new BigDecimal(Double.valueOf(value1));
            BigDecimal b2 = new BigDecimal(Double.valueOf(value2));
            return b1.divide(b2, scale).doubleValue();   
        }
    }
    
    展开全文
  • Double转换成BigDecimal进行运算的整理

    千次阅读 2019-01-15 16:59:19
    Double转换成BigDecimal进行运算的整理 由于double进行加减乘除运算容易丢失精度,所以一般把double转换成BigDecimal进行调用BigDecimal的加减乘除方法进行运算之后在转double类型 BigDecimal的运算(加减乘除)...

    Double转换成BigDecimal进行运算的整理 


    由于double进行加减乘除运算容易丢失精度,所以一般把double转换成BigDecimal进行调用BigDecimal的加减乘除方法进行运算之后在转成double类型

    BigDecimal的运算(加减乘除)

    BigDecimal bignum1 = new BigDecimal("10");  
    BigDecimal bignum2 = new BigDecimal("5");  
    BigDecimal bignum3 = null;  
      
    //加法  
    bignum3 =  bignum1.add(bignum2);       
    System.out.println("和 是:" + bignum3);  
      
    //减法  
    bignum3 = bignum1.subtract(bignum2);  
    System.out.println("差  是:" + bignum3);  
      
    //乘法  
    bignum3 = bignum1.multiply(bignum2);  
    System.out.println("积  是:" + bignum3);  
      
    //除法  
    bignum3 = bignum1.divide(bignum2);  
    System.out.println("商  是:" + bignum3);

    double类型转化成 BigDecimal 类型进行 加减乘除 运算整理

    public class Arith {
        /**
         * 提供精确加法计算的add方法
         * @param value1 被加数
         * @param value2 加数
         * @return 两个参数的和
         */
        public static double add(double value1,double value2){
            BigDecimal b1 = new BigDecimal(Double.valueOf(value1));
            BigDecimal b2 = new BigDecimal(Double.valueOf(value2));
            return b1.add(b2).doubleValue();
        }
         
        /**
         * 提供精确减法运算的sub方法
         * @param value1 被减数
         * @param value2 减数
         * @return 两个参数的差
         */
        public static double sub(double value1,double value2){
            BigDecimal b1 = new BigDecimal(Double.valueOf(value1));
            BigDecimal b2 = new BigDecimal(Double.valueOf(value2));
            return b1.subtract(b2).doubleValue();
        }
         
        /**
         * 提供精确乘法运算的mul方法
         * @param value1 被乘数
         * @param value2 乘数
         * @return 两个参数的积
         */
        public static double mul(double value1,double value2){
            BigDecimal b1 = new BigDecimal(Double.valueOf(value1));
            BigDecimal b2 = new BigDecimal(Double.valueOf(value2));
            return b1.multiply(b2).doubleValue();
        }
         
        /**
         * 提供精确的除法运算方法div
         * @param value1 被除数
         * @param value2 除数
         * @param scale 精确范围
         * @return 两个参数的商
         * @throws IllegalAccessException
         */
        public static double div(double value1,double value2,int scale) throws IllegalAccessException{
            //如果精确范围小于0,抛出异常信息
            if(scale<0){        
                throw new IllegalAccessException("精确度不能小于0");
            }
            BigDecimal b1 = new BigDecimal(Double.valueOf(value1));
            BigDecimal b2 = new BigDecimal(Double.valueOf(value2));
            return b1.divide(b2, scale).doubleValue();   
        }
    }

     

    展开全文
  • 下面小编就为大家带来一篇java中double转化BigDecimal精度缺失的实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
  • 目录double类型转BigDecimal的正确姿势有两种 double类型转BigDecimal的正确姿势有两种 BigDecimal.valueOf(Double_Value) new BigDecimal(String.valueOf(Double_Value)) 原因: BigDecimal最佳实践是支持String...

    double类型转BigDecimal的正确姿势有两种

    1. BigDecimal.valueOf(Double_Value)
    2. new BigDecimal(String.valueOf(Double_Value))
      原因:
      BigDecimal最佳实践是支持String类型的构造方法。

    Note: For values other than float and double NaN and ±Infinity, this constructor is compatible with the values returned by Float.toString and Double.toString. This is generally the preferred way to convert a float or double into a BigDecimal, as it doesn’t suffer from the unpredictability of the BigDecimal(double) constructor.

    public BigDecimal(String val) {
           this(val.toCharArray(), 0, val.length());
       }
    
    展开全文
  • 今天写代码过程中,发现一个Double的变量通过new BigDecimal(Double d)转换BigDecimal时,有效数字改变了,如下: public class BigDecimalTest { public static void main(String[] arg) { String s1 = "123....
  • Double数据转化BigDecimal,保证精度

    千次阅读 2020-06-07 12:16:11
    这是因为 0.1 无法准确地表示为 double。这样,传入到构造方法的值不会正好等于 0.1(虽然表面上等于该值)。 另一方面,String 构造方法是完全可预知的:写入 new BigDecimal(“0.1”) 将创建一个 BigDecimal,它...
  • 不能直接使用Bigdecimal的构造函数传double进行转换,部分数值会丢失精度,因为计算机是二进制的Double无法精确的储存一些小数位,0.1的double数据存储的值实际上并不真的等于0.1 如该方式将0.1转换Bigdecimal得到...
  • JAVA中double转化BigDecimal精度缺失测试  @SuppressWarnings("static-access")  public static void main(String[] args) {  System.out.println(3215.10/2);  BigDecimal bd = new BigDecimal(3215
  • BigDecimalDouble转换

    2017-06-22 16:44:45
    BigDecimalDouble转换
  • Java中DoubleBigDecimal的相互转换

    千次阅读 2021-03-08 07:10:15
    今天写代码过程中,发现一个Double的变量通过new BigDecimal(Double d)转换BigDecimal时,有效数字改变了,如下:public class BigDecimalTest {public static void main(String[] arg) {String s1 = "123.45";...
  • packagearchie2010;importjava.math.BigDecimal;importjava.math.MathContext;publicclassBigDecimalTest{publicstaticvoidmain(String[]args){//TODOAuto-generatedmethodstubdoubled1,d2;d1=0.10334;d2=...
  • Double double = 1.23d; BigDecimal bd = new BigDecimal(double ) 时,出现转化得到的BigDecimal db的小数点位数边长的问题。 解决办法: BigDecimal bd = BigDecimal.valueof(double );
  • DoubleBigDecimal Double channelPrice=3.1452; BigDecimal a=new BigDecimal(channelPrice); BigDecimal b =a.setScale(2, RoundingMode.HALF_UP); System.out.println(b); //b=3.14
  • Java中doubleBigDecimal的注意事项

    万次阅读 多人点赞 2018-08-10 16:01:20
    先上结论:不要直接用double变量作为构造BigDecimal的参数。   线上有这么一段Java代码逻辑: 1,接口传来一个JSON串,里面有个数字:57.3。 2,解析JSON并把这个数字保存在一个float变量。 3,把这个float...
  • Well I get this crazy long number sometimes, so I convert it to BigDecimal like so: bdRatio = new BigDecimal(indPayRatio[i]); At this line, I get the following stack trace from many users. I am ...
  • BigDecimal类型和double类型的值相互转换 1.BigDecimaldouble,使用BigDecimal类里面doubleValue()方法: BigDecimal latitude = 39.97268600; double latitudeDou = latitude.doubleValue() 2.double转...
  • 对于不需要任何准确计算精度的数字可以直接使用float或double,但是如果需要精确计算的结果,则必须使用BigDecimal类,而且使用BigDecimal类也可以进行大数的操作。BigDecimal类的常用方法如表11-15所示。 表11-15 ...
  • 有方法 java.math.BigDecimal.doubleValue() BigDecimal a = new BigDecimal(1000); return a.doubleValue(); public static void printDoubleToBigDecimal(double v1, double v2){ BigDecimal d1TobigDe...
  • Java中doubleBigDecimal

    2020-09-16 13:37:07
    BigDecimal(double val)
  • **禁止使用构造方法 BigDecimal(double)的方式把 double转化BigDecimal 对象** **正例:**优先推荐入参为 String 的构造方法,或使用 BigDecimal 的 valueOf 方法,此方法内部其实执行了Double 的 toString,...
  • JackSon Double类型转换BigDecimal类型

    千次阅读 2019-12-16 16:01:11
    话不多说直接放代码: SimpleModule module = new ...module.addSerializer(Double.class, new StdSerializer(BigDecimal.class) { @Override public void serialize(Object o, JsonGenerator jsonGenerator,...
  • double转换BigDecimal

    千次阅读 2016-03-28 17:11:14
    [code="java"]BigDecimal b = new BigDecimal(d, MathContext.DECIMAL64);[/code]
  • 使用BigDecimal解决double类型数据运算的精度问题
  • 在项目中,一般遇到关于金钱方面的,我们会使用BigDecimal类型存储金额,但是通常情况下金额都是double类型,需要转换BigDecimal类型。但是使用不当,会造成金额错误。 public class TestBigDecimal { public ...
  • 1,保留6位小数点NumberFormat format = NumberFormat.getInstance();...String s= format.format(double/BigDecimal); DecimalFormat df = new DecimalFormat("0.000000"); String ss= ...
  • 有人可能认为在Java中写入newBigDecimal(0.1)所创建的BigDecimal正好等于 0.1(非标度值 1,其标度为 1),但是它实际上等于0.1000000000000000055511151231257827021181583404541015625。这是因为0.1无法准确地表示...
  • 使用new BigDecimal(double val)对doubel进行转换会导致转换后精度丢失 原因 BigDecimal的构造函数public BigDecimal(double val)会损失了double 参数的精度。jdk中已经明确不建议使用new BigDecimal(double value)...
  • 记录一次alibaba.fastjson,Double类型被转换BigDecimal类型解决方法问题描述查询问题如何解决 问题描述 在一次开发过程当中遇到的一个关于FastJson的问题,我获取到的数据对象是一种无规则的json字符串,需要转换...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 29,605
精华内容 11,842
关键字:

double转换成bigdecimal