JS toFixed()方法精度丢失

toFixed()方法可把Number四舍五入为指定小数位数的数字。但这个方法并不完全遵从四舍五入的规则,如

2.485.toFixed(2) //=>2.48

网上流行的说法是遵循银行家舍入法,即:四舍六入五成双。四舍六入字面意思,5的话看后面不为零就进一,如果为零看5前面的数是奇数还是偶数,奇数进一偶数舍弃。但经过实际测试发现也不完全遵从这个规则(chrome下),如

  1. 2.485.toFixed(2) //=>2.48
  2. 1.485.toFixed(2) //=>1.49

解决方法,在main入口(如App.vue),重写toFixed方法,分几种情况来处理

  1. Number.prototype.toFixed = function (n) {
  2. if (n > 20 || n < 0) { //精度允许0-20
  3. throw new RangeError('toFixed() digits argument must be between 0 and 20');
  4. }
  5. const number = this;
  6. if (isNaN(number) || number >= Math.pow(10, 21)) {
  7. return number.toString();
  8. }
  9. if (typeof (n) == 'undefined' || n == 0) {
  10. return (Math.round(number)).toString();
  11. }
  12. //判断是否为负数
  13. var isMinus = number > 0 ? false : true;
  14. let result = number.toString();
  15. const arr = result.split('.');
  16. // 整数的情况
  17. if (arr.length < 2) {
  18. result += '.';
  19. for (let i = 0; i < n; i += 1) {
  20. result += '0';
  21. }
  22. return result;
  23. }
  24. const integer = arr[0];
  25. const decimal = arr[1];
  26. //小数位数和精确位数相等时
  27. if (decimal.length == n) {
  28. return result;
  29. }
  30. //小数位数小于精确位数时
  31. if (decimal.length < n) {
  32. for (let i = 0; i < n - decimal.length; i += 1) {
  33. result += '0';
  34. }
  35. return result;
  36. }
  37. result = integer + '.' + decimal.substr(0, n);
  38. const last = decimal.substr(n, 1);
  39. // 四舍五入,转换为整数再处理,避免浮点数精度的损失
  40. if (parseInt(last, 10) >= 5) {
  41. const x = Math.pow(10, n);
  42. // 对于过精度位的下一位值大于5时,正数+1 负数-1.
  43. // 正数例如6.257 转化为两位精度的小数是 6.26。
  44. // 负数例如-6.258 转化为两位精度的小数是 -6.26。
  45. result = (Math.round((parseFloat(result) * x)) + (isMinus ? -1 : 1)) / x;
  46. result = result.toFixed(n);
  47. }
  48. return result;
  49. };

JS toFixed()方法精度丢失解决方法的更多相关文章

  1. ASP.NET Web Service中使用Session 及 Session丢失解决方法 续

    原文:ASP.NET Web Service中使用Session 及 Session丢失解决方法 续 1.关于Session丢失问题的说明汇总,参考这里 2.在Web Servcie中使用Sessio ...

  2. JS 无法清除Cookie的解决方法

    JS 无法清除Cookie的解决方法   项目中使用sdmenu.js时,需要在登录时清除Cookie,而sdmenu默认是会保存Cookie的 下面是sdmenu.js保存Cookie的方法 doc ...

  3. Hibernate的懒加载session丢失解决方法

    在web.xml加入spring提供的过滤器,延长session的生命周期 <!--Hibernate的懒加载session丢失解决方法 --> <filter> <fi ...

  4. Android 非Activity类引用getResources()方法问题的解决方法

    在进行Android开发的过程中,在一个非Activity类(此处假设类名为MyNewClass)中引用了getResources()方法,如下: Bitmap bmp = BitmapFactory ...

  5. IE8下部分方法失效的解决方法

    1.IE8下String的Trim()方法失效的解决方法 用jquery的trim()方法,$.trim(str)就可以了: 例:_id.trim() !='' 改为  $.trim(_id) != ...

  6. 移动端前端笔记 — 遇到的常见JS与CSS问题及解决方法 ( 摘自zdwzdwzdw)

    笔者接触移动前端快一年了,特将平时的一些笔记整理出来,希望能够给需要的人一些小小的帮助.同时也由于笔者的水平有限,虽说都是笔者遇到过使用过的,但文中可能也会出现一些问题或不严谨的地方,望各位指出,不胜 ...

  7. Ajax异步获取html数据中包含js方法无效的解决方法

    页面上使用js写了一个获取后台数据的方法 function data() { var tab = $("#dic") $.ajax({ url: '../demo.ashx?met ...

  8. php 页面调转导致session丢失解决方法

    例如在a页面设置了会话,然后打印会话值,可以成功打印,但是调转到b页面后,会话丢失了. 原因有不少,一个原因就是没有在页面开头加入session_start();当然你也可以直接配置php.ini文件 ...

  9. 移动端遇到的常见JS与CSS问题及解决方法

    由于笔者的水平有限,虽说都是笔者遇到过使用过的,但文中可能也会出现一些问题或不严谨的地方,望各位指出,不胜感激! 一. css部分 body如果设置height:100%;overflow:hidde ...

  10. vite2 打包的时候vendor-xxx.js文件过大的解决方法

    vite2是一个非常好用的工具,只是随着代码的增多,打包的时候 vendor-xxxxxx.js 文件也越来越大,这就郁闷了. 打包时遇到警告 输出文件名字/static/vendor.9b5698e ...

随机推荐

  1. Django: 获取头信息

    如何获取请求头信息 使用如下函数request.META.get("HTTP_请求头函数"),需要注意的是,请求头变量需要全部大写. 其他注意事项如下所示: 如果headerkey ...

  2. 用python selenium提取网页中的所有<a>标签中的超级链接地址

    urls = driver.find_elements_by_xpath("//a") for url in urls: print(url.get_attribute(" ...

  3. PLE-实践小结-2308-cnblogs

    某场景介绍 前状:三模型,权重融合 解决问题:融合目标行为,充分利用样本信息,节省资源开销. 当前效果 主场景人均真实曝光+0.26%,不显著:子场景人均真实曝光+0.35%,不显著 千曝互动+2.6 ...

  4. 文心一言 VS 讯飞星火 VS chatgpt (72)-- 算法导论7.1 3题

    三.请简要地证明:在规模为 n 的子数组上,PARTITION 的时间复杂度为 Θ(n). 文心一言: 首先,我们需要明确PARTITION函数的具体定义.PARTITION函数通常用于快速排序算法中 ...

  5. debian11安装配置记录

    安装 软件包默认是桌面环境 + gnome + 标准安装.如果做服务器,建议标准安装 + ssh server 设置静态ip cd /etc/network/interfaces.d vi ifcfg ...

  6. LeetCode 周赛上分之旅 #39 结合中心扩展的单调栈贪心问题

    ️ 本文已收录到 AndroidFamily,技术和职场问题,请关注公众号 [彭旭锐] 和 BaguTree Pro 知识星球提问. 学习数据结构与算法的关键在于掌握问题背后的算法思维框架,你的思考越 ...

  7. Hugging News #0814: Llama 2 学习资源大汇总 🦙

    每一周,我们的同事都会向社区的成员们发布一些关于 Hugging Face 相关的更新,包括我们的产品和平台更新.社区活动.学习资源和内容更新.开源库和模型更新等,我们将其称之为「Hugging Ne ...

  8. 关于 LLM 和图数据库、知识图谱的那些事

    本文整理自 NebulaGraph 布道师 wey 在「夜谈 LLM」主题分享上的演讲,主要包括以下内容: 背景 LLM RAG Graph 知识抽取 Text2Cypher Graph RAG 未来 ...

  9. AI绘画:StableDiffusion炼丹Lora攻略-实战萌宠图片生成

    写在前面的话 近期在小红书发现了许多极其可爱.美观的萌宠图片,对这些美妙的图像深深着迷 于是想着看看利用AI绘画StableDiffusion以下简称(SD)做出来. 以下是详细实操的全过程,包括所有 ...

  10. Programming abstractions in C阅读笔记:p130-p131

    <Programming Abstractions In C>学习第52天,p130-p131,总结如下: 一.技术总结 1. pig latin game 通过pig latin gam ...