java保留两位小数和js保留两位小数一致性研究

Posted 追极

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java保留两位小数和js保留两位小数一致性研究相关的知识,希望对你有一定的参考价值。

一、java保留两位小数方式

public static void main(String[] args) {

        System.out.println("=======DecimalFormat(四舍五入,五入可能失败)=========");
        DecimalFormat decimalFormat = new DecimalFormat("0.00");
        System.out.println(decimalFormat.format(0.235)); //0.23
        System.out.println(decimalFormat.format(1.235)); //1.24


        System.out.println("=======String.format(四舍五入)=========");
        System.out.println(String.format("%.2f",0.235)); //0.24
        System.out.println(String.format("%.2f",1.235)); //1.24

        System.out.println("=======NumberFormat(四舍五入,五入可能失败)=========");
        NumberFormat nf = NumberFormat.getNumberInstance();
        nf.setMaximumFractionDigits(2);
        System.out.println(nf.format(0.235)); //0.23
        System.out.println(nf.format(1.235)); //1.24


        System.out.println("=======BigDecimal(指定舍入模式,构造函数使用String类型方可精确计算)=========");
        System.out.println("ROUND_HALF_DOWN:五舍五点1入");
        //BigDecimal bigDecimal = new BigDecimal(1.235); //直接使用double类型计算不对
        // System.out.println(bigDecimal.setScale(2,BigDecimal.ROUND_HALF_DOWN).doubleValue());

        BigDecimal  bigDecimal = new BigDecimal(String.valueOf(0.235));
        System.out.println(bigDecimal.setScale(2,BigDecimal.ROUND_HALF_DOWN).doubleValue()); //0.23

        bigDecimal = new BigDecimal(1.235+"");
        System.out.println(bigDecimal.setScale(2,BigDecimal.ROUND_HALF_DOWN).doubleValue()); //1.23

        bigDecimal = new BigDecimal(1.2351+"");
        System.out.println(bigDecimal.setScale(2,BigDecimal.ROUND_HALF_DOWN).doubleValue()); //1.24

        System.out.println("ROUND_HALF_UP:四舍五入");
        //bigDecimal = new BigDecimal(0.235); //直接使用double类型计算不对
       // System.out.println(bigDecimal.setScale(2,BigDecimal.ROUND_HALF_UP).doubleValue());


        bigDecimal = new BigDecimal(String.valueOf(0.235));
        System.out.println(bigDecimal.setScale(2,BigDecimal.ROUND_HALF_UP).doubleValue()); //0.24


        bigDecimal = new BigDecimal(1.235+"");
        System.out.println(bigDecimal.setScale(2,BigDecimal.ROUND_HALF_UP).doubleValue()); //1.24
    }

结果

=======DecimalFormat(四舍五入,五入可能失败)=========
0.23
1.24
=======String.format(四舍五入)=========
0.24
1.24
=======NumberFormat(四舍五入,五入可能失败)=========
0.23
1.24
=======BigDecimal(指定舍入模式,构造函数使用String类型方可精确计算)=========
ROUND_HALF_DOWN:五舍五点1入
0.23
1.23
1.24
ROUND_HALF_UP:四舍五入
0.24
1.24

 

二、js保留两位小数

0.235.toFixed(2); //0.23
1.235.toFixed(2); //1.24

 

总结:

1.js.toFixed方式与java的DecimalFormat和NumberFormat方式一致,结果不确定,四舍五可能不入!

2.java可以做到精确的四五五入可采用String.format方式和BigDecimal的ROUND_HALF_UP方式,但是必须确保BigDecimal的构造参数为String类型,否则也会发生五不入现象。

3.js精确四舍五入实现方法,网上找到的例子,如下

Number.prototype.toFixed = function( fractionDigits )  
{  
    //没有对fractionDigits做任何处理,假设它是合法输入  
    return (parseInt(this * Math.pow( 10, fractionDigits  ) + 0.5)/Math.pow(10,fractionDigts)).toString();  
}  

 

所以,如果保持前后台计算一致,则有如下方案

前端    后台    结果 
toFixed DecimalFormat or NumberFormat   不精确四舍五入,但结果一致
改进后的toFixed BigDecimal使用ROUND_HALF_UP模式  精确四五五入,结果也一致

由于浏览器的多样性,数据的无限性,没有做过多测试,这只是初步结论。要确保万无一失,还是由一处计算方为上策!

以上是关于java保留两位小数和js保留两位小数一致性研究的主要内容,如果未能解决你的问题,请参考以下文章

java保留两位小数

java编程如何保留两位小数

js校验输入0-1之间的小数,最多保留小数点后两位

[js/jq]保留两位小数的问题

java 保留两位小数点

JS正则表达式,限制输入数字,且小数点保留两位