惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

J
Java Code Geeks
Stack Overflow Blog
Stack Overflow Blog
P
Proofpoint News Feed
L
LangChain Blog
C
Check Point Blog
F
Fortinet All Blogs
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Blog — PlanetScale
Blog — PlanetScale
腾讯CDC
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Jina AI
Jina AI
Recent Announcements
Recent Announcements
雷峰网
雷峰网
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
N
Netflix TechBlog - Medium
博客园 - 【当耐特】
Hugging Face - Blog
Hugging Face - Blog
Microsoft Azure Blog
Microsoft Azure Blog
U
Unit 42
The Cloudflare Blog
月光博客
月光博客
有赞技术团队
有赞技术团队
G
Google Developers Blog
Vercel News
Vercel News

博客园 - 水手paul2008

MySQL 数据库归档日志相关 SQL Server 数据库给第三方用户开权限,限制可见内容。 visual svn server 迁移 windbg preview调试winform程序卡死 .net List.ForEach内部Async/Await 异步的问题 asp.net core 大并发设置 SQLServer数据库优化 windbg 调试 winform程序(二车间机台程序) IIS日志分析工具 .Net的三个Timer内Interval是不精确的 IE 碰到<不能执行已释放 Script 的代码> IIS应用程序池设置若干 关于thinkpad t440s的声卡失真问题,竟然带来对旧电脑的惊喜 ArcMap10.4 遇到严重的应用程序错误,无法继续 给汽车换牌照灯的故事 .Net 混淆器ConfuserEx 车辆年检、强险、车船税的关系 .Net下几种ORM Windows 刷新图标命令
JavaScript的数字运算不准的问题
水手paul2008 · 2023-10-17 · via 博客园 - 水手paul2008

JavaScript的运算问题存在两方面:

第一个表示不准问题:

打开浏览器按F12,在Console里,

输入0.1+0.2=0.30000000000000004

输入91.25*0.7 =63.87499999999999 

解决这个问题,要用第三方库math.js 或 decimal.js 

const math = require('mathjs');
console.log(math.add(0.1, 0.2));

第二个问题toFixed是银行家舍入,如果要求四舍五入,那需要另写方法。

银行家舍入是“四舍六入五进偶”(四舍六入五取偶)(四舍六入五成双)。例如

0.15.toFixed(1)=0.1; //5前一位是奇数1,“舍”,

0.25.toFixed(1)=0.3; //5前一位是偶数2,才会“入”,

其实浏览器toFixed不知什么算法,很乱。

.Net算法准 Math.Round(5.665, -2);默认就是银行家算法,如果需要四舍五入,需要第三个参数设置AwayFromZero:Math.Round(1.005, 2,MidpointRounding.AwayFromZero);

但你如果运行此语句,结果为何仍旧是1,而不是1.01?因为.net对常量小数默认为转换为double型,double型是不精确的,如需要得到正确的1.01,需要Round的另一decimal重载Math.Round((decimal)1.005, 2,MidpointRounding.AwayFromZero);即可。

以下给出js的四舍五入算法,toFixed2

/* 
* Number.toFiexed默认是四舍六入五进偶,而有些地方需要四舍五入。
* console.log(64.925.toFixed(2),64.935.toFixed(2)); 默认:64.92 64.94. 
* console.log(math.toFixed2(64.925,2),math.toFixed2(64.935,2)); 期待:64.93 64.94. 
*/
export function toFixed2(num, n) {
  //console.log('toFixed2')
  var rounded = math.round(num, n);
  var result = rounded.toString();
  if (n <= 0)
    return result;

  var idx = result.indexOf('.');
  if (idx < 0) {
    idx = result.length;
    result += '.';
  }
  while (result.length <= idx + n) {
    result += '0';
  }
  return result;
}