[js/jq]保留两位小数的问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[js/jq]保留两位小数的问题相关的知识,希望对你有一定的参考价值。
我之前是直接用 .tofixed(2)方法来处理的,但是对于这种
<c:forEach var="li" items="$test.list">
$li[4]
</c:forEach>
怎么写都没有用。是我写法的问题吗?还是方法错了?求解
$(li[4]).tofixed(2) 、$parseFloat(li[4]).tofixed(2) 都不好使……
JSTL(fn函数)
在页面的最上方引用:
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>;
其次,JSTL函数一般都是处理字符的,例如:$fn:substring(li, 6, -2)获取子串;
JSTL是标签,是html元素,但是tofixed()是javascript,是脚本语言,是不能混在一起用的。追问
您好,那样的话怎样可以让“li[4]”保留两位小数呢?
追答您好,JSTL函数一般都是处理并显示字符串用的,截取子字符串无法达到四舍五入保留两位小数的效果,只能建议你在后台获取数据时处理数据,前台只负责显示
本回答被提问者和网友采纳 参考技术B 是$li[4]得不到值吧??将list集合中数据遍历到li中,一般这样取值:$li.集合中的变量名,tofixed会有浏览器的兼容性问题,建议还是使用js追问您好,请问怎样可以让“li[4]”保留两位小数呢?
参考技术C 不知道你这是什么框架的标签,最好是用框架里自带的方法来进行处理,否则就在把数值传到前台页面之前,比如在java里面用Math.round来处理追问用的是jstl的 标签
追答我觉得吧,jstl毕竟是jsp的语法,你要在里面嵌入js的函数应该不太可能,要不就按照我说的先在后台经过处理再传到前台
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模式 | 精确四五五入,结果也一致 |
由于浏览器的多样性,数据的无限性,没有做过多测试,这只是初步结论。要确保万无一失,还是由一处计算方为上策!
以上是关于[js/jq]保留两位小数的问题的主要内容,如果未能解决你的问题,请参考以下文章