如何处理php的四位小数到js中显示多位的问题?

php生成结果如下:

ERROR - 2017-12-04 10:25:39 --> 0.2778--double
ERROR - 2017-12-04 10:25:39 --> 0.6111--double
ERROR - 2017-12-04 10:25:39 --> 0.1111--double

将其组合成字符串后传给js中生成饼状图,表格插件highcharts:
图片描述

我传给前端的是一个字符串(不是数字),格式如下:['门店1',27.78],['门店2',61.11],['门店3',11.11],但是那个门店1的结果就显示不对,但是我这边不知道如何处理。请问如何解决?

阅读 4k
7 个回答

javascript数字精度问题,在小数和超大数都有可能出现。

对于小数在计算过程中,我们可以扩大倍数在计算,取整,然后缩小倍数得到实际结果,举个例子:

var a = 0.1,b=0.2;
console.log(a+b);//0.30000000000000004
console.log(parseInt(a*10000+b*10000)/10000)//0.3
//注意10000表示你要精确到小数后四位

这样看起来是没多少问题了,但是前面说过了一个问题,javascript对于超大的整数(超过了Math.pow(2, 53))也存在一个精度问题,看下面:

9999999999999999 == 10000000000000001; //true

所以当如果你需要精确的小数位比较多,那么你扩大的倍数肯定就比较大,最后得出的整数就会可能超过Math.pow(2, 53),那么就存在一个精度问题。这是一个无法避免的问题。

对于这种问题一般可以分两步解决:小数的计算可以扩大倍数;对于超大数,可以考虑转换数量级单位保存,例如元转换成万元,亿元.

如果不对,请指出.

这个原因是因为js和php对于数据类型方式微有不同的原因,简单讲一下就是js的浮点数小数部分的储存方式是根据e的次方来储存的,详情可以参考我的笔记,如果你要很精确的话,可以参考我的转换方法,但是php储存方式我不太了解,你可以看一下官方文档或者源代码。抑或你不需要太精确可以简单地用Math.floor或者Math.ceiling来四舍五入。

var str = "0.1256789";//原数值
// obj:操作的字符串,num:指定要取小数点到第几位
// 方法1:巧移小数点,可取四舍五入
function roundPlaces (obj,num) {
    var temp=obj*Math.pow(10,num);
    temp=Math.round(temp);
    temp=temp/Math.pow(10,num);
    return temp;
}

number_format 处理呢?

$number = 1234.5678;

$english_format_number = number_format($number, 2); // 1234.57

参考:number_format

PHP,BC高精确度函数库

这个和后端同学是没有关系的,传入的是整形还是字符串都是可以的,问题的关键是前端同学处理的时候先除以100然后又乘100导致的比如:(27.78/100)*100=27.779999999999998;这个是你出现问题的原因
解决办法有两个,
一、你返回27.78%这样的字符串
二,让前端同学直接显示不要在运算了。

var num = 27.779999999999998;
console.log(num.toFixed(2)); //27.78

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题