`
lym12300
  • 浏览: 31072 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

double小数点问题

    博客分类:
  • JAVA
阅读更多
NumberFormat format = new DecimalFormat("#0.00");

使用Java,double 进行运算时,经常出现精度丢失的问题,总是在一个正确的结果左右偏0.0000**1。 特别在实际项目

中,通过一个公式校验该值是否大于0,如果大于0我们会做一件事情,小于0我们又处理其他事情。 这样的情况通过

double计算出来的结果去和0比较大小,尤其是有小数点的时候,经常会因为精度丢失而导致程序处理流程出错。
     所以一般对double类型进行运算时,做好对结果进行处理,然后拿这个值去做其他事情。

     目前总结如下:

    
    /** 
     * 对double数据进行取精度. 
     * @param value  double数据. 
     * @param scale  精度位数(保留的小数位数). 
     * @param roundingMode  精度取值方式. 
     * @return 精度计算后的数据. 
     */ 
    public static double round(double value, int scale,
             int roundingMode) {  
        BigDecimal bd = new BigDecimal(value);  
        bd = bd.setScale(scale, roundingMode);  
        double d = bd.doubleValue();  
        bd = null;  
        return d;  
    }  



     
    /**
     * double 相加
     * @param d1
     * @param d2
     * @return
     */
    public double sum(double d1,double d2){
        BigDecimal bd1 = new BigDecimal(Double.toString(d1));
        BigDecimal bd2 = new BigDecimal(Double.toString(d2));
        return bd1.add(bd2).doubleValue();
    }



   
    /**
     * double 相减
     * @param d1
     * @param d2
     * @return
     */
    public double sub(double d1,double d2){
        BigDecimal bd1 = new BigDecimal(Double.toString(d1));
        BigDecimal bd2 = new BigDecimal(Double.toString(d2));
        return bd1.subtract(bd2).doubleValue();
    }


    
    /**
     * double 乘法
     * @param d1
     * @param d2
     * @return
     */
    public double mul(double d1,double d2){
        BigDecimal bd1 = new BigDecimal(Double.toString(d1));
        BigDecimal bd2 = new BigDecimal(Double.toString(d2));
        return bd1.multiply(bd2).doubleValue();
    }



    
    /**
     * double 除法
     * @param d1
     * @param d2
     * @param scale 四舍五入 小数点位数
     * @return
     */
    public double div(double d1,double d2,int scale){
        //  当然在此之前,你要判断分母是否为0,  
        //  为0你可以根据实际需求做相应的处理

        BigDecimal bd1 = new BigDecimal(Double.toString(d1));
        BigDecimal bd2 = new BigDecimal(Double.toString(d2));
        return bd1.divide
               (bd2,scale,BigDecimal.ROUND_HALF_UP).doubleValue();
    }



这样,计算double类型的数据计算问题就可以处理了。
另外补充一下 JavaScript 四舍五入的方法:
小数点问题
Math.round(totalAmount*100)/100 (保留 2 位)

function formatFloat(src, pos)
{
  return Math.round(src*Math.pow(10, pos))/Math.pow(10, pos);
}
分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    C# Double保留小数点后面位数

    Crack8_编程小组[K.8] QQ吻 欢迎您 Blog http://qqhack8.blog.163.com

    Java Double 精度问题总结

    使用Java,double 进行运算时,经常出现精度丢失的问题,总是在一个正确的结果左右偏0.0000**1。 特别在实际项目中,通过一个公式校验该值是否大于0,如果大于0我们会做一件事情,小于0我们又处理其他事情。 这样的...

    判断数是否为double

    在判断数是否为double时,会用到小数点处理的问题,一个小数点还是多个小数点

    让html的text只能输入和1个小数点

    让html的text只能输入数字和1个小数点

    Java 基本类型double精度计算工具

    该工具用户进行double类型的精度计算,包含加法、减法、乘法、除法、精确点计算、小数点计算,限制小数点后数字

    float double精度的详细解释

    float double精度的详细解释,小数点位数等等

    c语言float类型小数点后位数

    C语言中浮点型一般分为float单精度型、double双精度型、long double长精度型,单精度浮点型小数点后面有效数字为6~7位和双精度浮点型小数点后面有效数字为15~16位。单精度为32位,双精度为64位,8位为一个字节。 在...

    AnalyzeDoubleAndDecimalDemo.rar

    Decimal转化为4个Int逻辑:将decimal去除小数点【不考虑正负号】后如 1234.5678M 整数部分是12345678。将去除小数点后的数字【12345678】转化为二进制。 因整数部分由96位组成,二进制左侧填充0(如果不够96位),...

    java代码-使用java计算圆类,半径r(double),计算周长,面积,π=3.14的源代码

    java代码-使用java计算圆类,半径r(double),计算周长,面积,π=3.14的源代码 ——学习参考资料:仅用于个人学习使用!

    程序中两个Double类型相加出现误差的解决办法

    以为是程序里的计算方法有问题,可是排查了很多地方,始终没有找到问题出在哪里。最后干脆把计算方法一句一句拆分,得到了最后最简单的一步,就是把两个具体的数值相加,但是最后的结果居然还是错误的。比如,现在...

    Java中Double除保留后小数位的几种方法(小结)

    主要介绍了Java中Double保留后小数位的几种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    格式化数字保留N位小数

    格式化数字保留N位小数 ...double strCashAmt=Convert.ToDouble(this.txtCashAmt.Text); //先把控件內的值转成double this.txtCashAmt.Text = strCashAmt.ToString("N",provider); //再利用ToString函数格式化小数位数

    精确计算工具类

    public static double div(double v1, double v2, int scale) { if (scale ) { throw new IllegalArgumentException( "The scale must be a positive integer or zero"); } BigDecimal b1 = new BigDecimal...

    VC API 计算器 double型

    用vc2008 编辑的简单的计算器 实现简单的加减乘除功能,带有界面 double型 精确到小数点后6位

    Java 加减乘除工具类(解决精度损失问题)

    * @desc 保留两位小数点 * @param value * @return java.lang.String * @author xm * @create 2018/6/7 12:03 **/ public static String format2point(Number value) { return df.format(value); } ...

    dbf文件读取

    dbf文件读取,数值型为字符串读取,满足数值型有小数点后的值不会用double型转换丢失。

    C语言基础知识

    double类型最少能精确到小数点后10位,通常是64位的。 通常double是最好的选择,因为其精度比较高,当然运行速度要比float要多不少。 double 和 float 的区别是double精度高,有效数字16位,float精度7位。但double...

    使用JavaFX实现的中缀转后缀 计算器(可以负数小数点括号)期末作业满分答案,大量注释(行行注释保证看懂)

    实现了 有理数(可以负数,可以小数点)之间的加减法(允许包含括号的加减乘除) 允许负数带括号 利用BigDecimal 大数据类 来保证精度 例如Double 2-1.1=0.89999,在大数据类就无异常 例如 9+(-9)=0 9--6=15 9*...

    关于Java小数点位数保留的解决方案

     double d = 0.200;  DecimalFormat df = new DecimalFormat(0.00);  System.out.println(df.format(d));  输出结果为:  0.20  若double d=0.000;输出结果为0.00;  若double d=0;输出结果为0.00;...

Global site tag (gtag.js) - Google Analytics