文档章节

解决Double类型的金额字段中使用保留两位小数并四舍五入的问题

风格若干
 风格若干
发布于 2017/08/28 11:54
字数 397
阅读 50
收藏 0

一、涉及到js计算的精度问题,toFixed(2)在js中,会出现如下情况:

eg:var yanglaoFee = 76.925;

    var shiyeFee = 76.935;

    当执行toFixed(2)时,js会判断如果小数点后的第三位值为5,之后会判断小数点后第二位的值是否是偶数,偶数:不进位(计算结果为76.92);奇数:进位(计算结果为76.94)

    为避免以上情况对金额计算的影响,将特殊情况进行单独处理,实现代码如下:

//解决toFixed(precision)问题方法
function round(number, precision) {
    var str = number + '';
    if (str.indexOf(".") == -1) {
        return number.toFixed(precision);
    } else {
        var len = str.length;
        var last = str.substr(len - 1, len);
        if (last == '5' && str.split(".")[1].length > precision) {
            last = '6';
            str = str.substr(0, len - 1) + last;
            return (str - 0).toFixed(precision)
        } else {
            return number.toFixed(precision)
        }
    }
}

二、后台java代码在实现保留两位小数的操作时,常用:

DecimalFormat df = new DecimalFormat("#.00");
Double yanglaoFee = Double.valueOf(df.format(val));

DecimalFormat("#.00")也会出现小数点后第三位值为5时进位与否判断小数点后第二位奇偶的情况,处理代码如下:

/**
    * 
    * @Method: decimalCalculation
    * @Description: 小数计算(四舍五入):解决DecimalFormat("#.00")使用时小数点后第三位值为5,第二位为偶数时无法进位的问题
    * @创建人:guozq
    * @创建时间:2017年8月24日
    * @修改人:
    * @param
    * @param startVal
    * @return double
    */
    public double decimalCalculation(Double startVal){
        DecimalFormat df = new DecimalFormat("#.00");  
	String startStr = startVal.toString();
	String startDecimal = startStr.split("\\.")[1];
	Double jishu = 0.01;
	Double endVal = 0.0;
	if(startDecimal.length()>2 && "5".equals(String.valueOf(startDecimal.charAt(2))) &&              
            Integer.parseInt(String.valueOf(startDecimal.charAt(1)))%2==0){
	    endVal = Double.valueOf(startStr.substring(0, startStr.length()-1))+jishu;
	} else{
	    endVal = Double.valueOf(df.format(startVal));
	}
	    return Double.valueOf(df.format(endVal));
    }

 

© 著作权归作者所有

共有 人打赏支持
风格若干
粉丝 6
博文 87
码字总数 53598
作品 0
西安
程序员
java.math.BigDecimal保留两位小数,保留小数,精确位数

java保留两位小数问题: 方式一(四舍五入形式保留两位小数,注意模式ROUNDHALFUP): 四舍五入 double f = 111231.5585; BigDecimal b = new BigDecimal(f); double f1 = b.setScale(2, BigD...

vshcxl
2016/10/27
2.2K
0
Android中关于保留小数点位数的处理

保留两位小数 方法一: 方式二: 例:new java.text.DecimalFormat(“#.00”).format(3.1415926) .00 表示两位小数 #.0000四位小数 以此类推… 方式三: %.2f %. 表示 小数点前任意位数 2 表...

天鬼
01/29
0
0
java保留两位小数

java保留两位小数问题: 方式一: 四舍五入 double f = 111231.5585; BigDecimal b = new BigDecimal(f); double f1 = b.setScale(2, BigDecimal.ROUNDHALFUP).doubleValue(); 保留两位小数 ......

日拱一卒
2016/09/05
31
0
保留两位小数的写法

Math.round()最后返回的是一个整形数(显然此种方法可以排除了),当然我们可以用这个方法间接实现保留两位小数的方法比如Math.round(34899/10d)/100d NumberFormat的setMaximumFractionDigits和...

fantasiter
2016/07/01
40
0
金额的计算BigDecimal类

金额的计算BigDecimal类 double d = 9.84; double d2 = 1.22; //注意需要使用BigDecimal(String val)构造方法 BigDecimal bigDecimal = new BigDecimal(Double.toString(d)); BigDecimal big......

Big_BoBo
2013/10/29
0
0

没有更多内容

加载失败,请刷新页面

加载更多

初级开发-编程题

` public static void main(String[] args) { System.out.println(changeStrToUpperCase("user_name_abc")); System.out.println(changeStrToLowerCase(changeStrToUpperCase("user_name_abc......

小池仔
今天
4
0
现场看路演了!

HiBlock
昨天
14
0
Rabbit MQ基本概念介绍

RabbitMQ介绍 • RabbitMQ是一个消息中间件,是一个很好用的消息队列框架。 • ConnectionFactory、Connection、Channel都是RabbitMQ对外提供的API中最基本的对象。Connection是RabbitMQ的s...

寰宇01
昨天
9
0
官方精简版Windows10:微软自己都看不过去了

微软宣布,该公司正在寻求解决方案,以减轻企业客户的Windows 10规模。该公司声称,企业客户下载整个Windows 10文件以更新设备既费钱又费时。 微软宣布,该公司正在寻求解决方案,以减轻企业...

linux-tao
昨天
19
0
TypeScript基础入门之JSX(二)

转发 TypeScript基础入门之JSX(二) 属性类型检查 键入检查属性的第一步是确定元素属性类型。 内在元素和基于价值的元素之间略有不同。 对于内部元素,它是JSX.IntrinsicElements上的属性类型...

durban
昨天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部