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(decimalFormat.format(2.235)); //2.23
System.out.println(decimalFormat.format(3.235)); //3.23
System.out.println(decimalFormat.format(4.235)); //4.24
System.out.println("保留n为小数,n>=1时和js的toFixed一致"); System.out.println("=======DecimalFormat(默认:ROUND_HALF_EVEN)");
decimalFormat = new DecimalFormat("0");
System.out.println(decimalFormat.format(0.5)); //
System.out.println(decimalFormat.format(1.5)); //
System.out.println(decimalFormat.format(2.5)); //
System.out.println(decimalFormat.format(3.5)); //
System.out.println("不保留小数,向偶数靠近,与toFixed不一致"); 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(String.format("%.2f",2.235)); //2.24
System.out.println(String.format("%.2f",3.235)); //3.24
System.out.println(String.format("%.0f",0.5)); //
System.out.println(String.format("%.0f",1.5)); //
System.out.println(String.format("%.0f",2.5)); //
System.out.println(String.format("%.0f",3.5)); // System.out.println("=======NumberFormat(和DecimalFormat一致)=========");
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(nf.format(2.235)); //2.23
System.out.println(nf.format(3.235)); //3.23
System.out.println(nf.format(4.235)); //4.24 nf.setMaximumFractionDigits(0);
System.out.println(nf.format(0.5)); //
System.out.println(nf.format(1.5)); //
System.out.println(nf.format(2.5)); //
System.out.println(nf.format(3.5)); //
System.out.println(nf.format(4.5)); // 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
}
二、js保留两位小数
在Google Chrome和Safari浏览器测试的结果
0.235.toFixed(2); //0.23
1.235.toFixed(2); //1.24
2.235.toFixed(2); //2.23
3.235.toFixed(2); //3.23
4.235.toFixed(2); //4.24 0.5.toFixed(0); //1
1.5.toFixed(0); //2
2.5.toFixed(0); //3
3.5.toFixed(0); //4
总结:
1.当保留至少一位小数时,js的toFixed方式与java的DecimalFormat和NumberFormat方式一致,结果不确定,四舍五可能不入!当不保留小数时,两种算法不一致,js四舍五入,java四舍五取偶。
2.java可以做到精确的四五五入可采用String.format方式和BigDecimal的ROUND_HALF_UP方式,但是必须确保BigDecimal的构造参数为String类型,否则也会发生五不入现象。
3.js精确四舍五入实现方法,网上找到的例子,如下
//覆盖默认的toFixed函数
Number.prototype.toFixed = function(s)
{
return (parseInt(this * Math.pow(10,s) + 0.5)/Math.pow(10,s)).toString();
}
所以,如果保持前后台计算一致,则有如下方案
前端 | 后台 | 结果 |
toFixed(n); n>=1 | DecimalFormat or NumberFormat | 不精确四舍五入,但结果一致 |
toFixed(0); | String.format("%.0f",0.5) 或者 BigDecimal使用ROUND_HALF_UP模式 | 精确四舍五入,结果一致 |
改进后的toFixed | String.format 或者 BigDecimal使用ROUND_HALF_UP模式 | 精确四五五入,结果也一致 |
由于浏览器的多样性,数据的无限性,没有做过多测试,这只是初步结论。要确保万无一失,还是由一处计算方为上策!
java保留两位小数和js保留两位小数一致性研究的更多相关文章
- js保留两位小数
js保留两位小数四舍五入: (Math.floor(until_price*100)/100).toFixed(2);//会四舍五入 保留两位小数 且不四舍五入(三种方式,请用最后一种): var ...
- (转)JS保留两位小数 四舍五入函数
本文转载自:http://www.cnblogs.com/446557021/archive/2011/10/13/2211047.html js 四舍五入函数 toFixed(),里面的参数 就是保 ...
- JS保留两位小数 四舍五入函数
js 四舍五入函数 toFixed(),里面的参数 就是保留小数的位数. <script language="javascript"> document.write(& ...
- js保留两位小数方法总结
js保留两位小数方法总结 最近在做结算系统,经常需要用到金额保留两位小数,刚开始我一直用的是Angular中的过滤器number |2,但是,这无法满足我的需求.问题是,当用户离开文本框时,我需要将用 ...
- Java 两个整数相除保留两位小数,将小数转化为百分数
Java 两个整数相除保留两位小数,将小数转化为百分数 源于:http://blog.sina.com.cn/s/blog_624d755d0101cvuq.html 后来学习了:http://blo ...
- 公共的强制保留两位小数的js方法
强制保留两位小数的js方法 //写一个公共的强制保留两位小数的js方法 function toDecimal2 (x) { var f = parseFloat(x) if (isNaN(f)) { ...
- js保留两位小数的方法
js保留两位小数的方法如下 1.toFixed()方法 需注意,保留两位小数,将数值类型的数据改变成了字符串类型 2.Math.floor(),不四舍五入 ,向下取整 注意,不改变数据类型 3.字符串 ...
- JS保留两位小数 [转]
js保留2位小数toFixed(xxxx) var a = 9.39393; alert(a.toFixed()); alert(Number.toFixed(9.39393)); 返回的是9. 对于 ...
- js保留两位小数数字
/* * @descript: 保留两位小数,如果小数点大于两位小数,就向上取值保留两位小数<br/> * @time 2016-07-13 */function mathCeil(num ...
随机推荐
- MySQL 数据库赋予用户权限操作表
MySQL清空数据库的操作:truncate table tablename; MySQL 赋予用户权限命令的简单格式可概括为:grant 权限 on 数据库对象 to 用户 一.grant 普通数 ...
- 20155333 《网络对抗》Exp4 恶意代码分析
20155333 <网络对抗>Exp4 恶意代码分析 基础问题回答 1.如果在工作中怀疑一台主机上有恶意代码,但只是猜想,所有想监控下系统一天天的到底在干些什么.请设计下你想监控的操作有哪 ...
- sinopia 搭建记录
最近公司有个问题,一些公共部分每次都要手动发送,放到 git 上涉及到父子 git 问题,现在就想在内部搭建一个 npm,涉及到公共模块了就直接 npm update 更新一下.找到了 sinopia ...
- C++学习之 类
1.类规范 类声明:包括数据成员.成员函数(共有接口)的声明 类方法定义 C++程序员将接口(类)放在头文件中,将实现放在源代码文件中 类设计尽量将共有接口和实现细节分开,数据隐藏(将数据放在私有部分 ...
- LAXCUS大数据操作系统节点挂掉后的处理
昨天回公司加班跑一个LAXCUS大数据应用,JVM直接挂了,没有留下任何异常信息,查看代码,也没有内存泄漏的问题.百思不得姐,只好去求教LAXCUS大数据操作系统的技术客服,客服查看了故障节点配置.日 ...
- [T-ARA][결혼 하지마][不要结婚]
歌词来源:http://music.163.com/#/song?id=27808773 作曲 : 二段横踢 [作曲 : 二段横踢] 作词 : 二段横踢 [作词 : 二段横踢] Hey anybody ...
- centos上部署mysql
本文记录整个安装的过程和跳进的坑,大家预祝我能从坑里爬出来吧 当前系统版本 开始我们的安装: 在安装之前查阅了部分资料,大体安装流程 yum -y install mysql yum -y insta ...
- PAT甲题题解-1075. PAT Judge (25)-排序
相当于是模拟OJ评测,这里注意最后输出:1.那些所有提交结果都是-1的(即均未通过编译器的),或者从没有一次提交过的用户,不需要输出.2.提交结果为-1的题目,最后输出分数是03.某个题目从没有提交过 ...
- MFC Cstring转化为string
Cstring m_filePath; string sname( CW2A( m_filePath.GetString())); http://blog.sina.com.cn/s/blog_530 ...
- idea 使用 mybaits generator
Intellij IDEA 14 作为JavaIDE 神器,接触后发现,非常好用,对它爱不释手,打算离开eclipse和myeclipse,投入Intellij IDEA的怀抱. 然而在使用的过程中会 ...