文档章节

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

风格若干
 风格若干
发布于 2017/08/28 11:54
字数 397
阅读 40
收藏 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

没有更多内容

加载失败,请刷新页面

加载更多

下一页

OSChina 周日乱弹 —— 种族不同,禁止交往

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @小小编辑:推荐歌曲《苏菲小姐》- 鱼果 《苏菲小姐》- 鱼果 手机党少年们想听歌,请使劲儿戳(这里) @貓夏:下大雨 正是睡觉的好时候 临睡前...

小小编辑
30分钟前
25
5
Python 搭建简单服务器

Python动态服务器网页(需要使用WSGI接口),基本实现步骤如下: 1.等待客户端的链接,服务器会收到一个http协议的请求数据报 2.利用正则表达式对这个请求数据报进行解析(请求方式、提取出文...

代码打碟手
32分钟前
0
0
Confluence 6 删除垃圾内容

属性(profile)垃圾 属性垃圾的定义为,一个垃圾用户在 Confluence 创建了用户,但是这个用户在自己的属性页面中添加了垃圾 URL。 如果你有很多垃圾用户在你的系统中创建了属性,你可以使用...

honeymose
今天
0
0
qduoj~前端~二次开发~打包docker镜像并上传到阿里云容器镜像仓库

上一篇文章https://my.oschina.net/finchxu/blog/1930017记录了怎么在本地修改前端,现在我要把我的修改添加到部署到本地的前端的docker容器中,然后打包这个容器成为一个本地镜像,然后把这...

虚拟世界的懒猫
今天
1
0
UML中 的各种符号含义

Class Notation A class notation consists of three parts: Class Name The name of the class appears in the first partition. Class Attributes Attributes are shown in the second par......

hutaishi
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部