小白菜鸟集合体 2022-10-02 00:34 采纳率: 84.2%
浏览 22
已结题

请问,这个红线处的数值为什么保留了那么多位,它的上一个总价也没输出那么多位👀

请问,这个红线处的数值为什么保留了那么多位,它的上一个另一个产品总价也没输出那么多位👀

img

img

  • 写回答

3条回答 默认 最新

  • Java Fans 全栈领域优质创作者 2022-10-02 06:50
    关注

    使用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);
    }

    希望以上对博友有所帮助

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 10月10日
  • 已采纳回答 10月2日
  • 创建了问题 10月2日

悬赏问题

  • ¥50 yalmip+Gurobi
  • ¥20 win10修改放大文本以及缩放与布局后蓝屏无法正常进入桌面
  • ¥15 angular开发过程中,想要读取模型文件,即图1的335行,会报404错误(如图2)。但我的springboot里配置了静态资源文件,如图3。且在该地址下我有模型文件如图4,请问该问题该如何解决呢?
  • ¥15 itunes恢复数据最后一步发生错误
  • ¥15 关于#windows#的问题:2024年5月15日的win11更新后资源管理器没有地址栏了顶部的地址栏和文件搜索都消失了
  • ¥100 H5网页如何调用微信扫一扫功能?
  • ¥15 讲解电路图,付费求解
  • ¥15 有偿请教计算电磁学的问题涉及到空间中时域UTD和FDTD算法结合的
  • ¥15 vite打包后,页面出现h.createElement is not a function,但本地运行正常
  • ¥15 Java,消息推送配置