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

推荐订阅源

Martin Fowler
Martin Fowler
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
A
About on SuperTechFans
Apple Machine Learning Research
Apple Machine Learning Research
The Register - Security
The Register - Security
Vercel News
Vercel News
H
Hackread – Cybersecurity News, Data Breaches, AI and More
人人都是产品经理
人人都是产品经理
MyScale Blog
MyScale Blog
云风的 BLOG
云风的 BLOG
博客园_首页
U
Unit 42
T
Tailwind CSS Blog
G
GRAHAM CLULEY
F
Full Disclosure
V
Vulnerabilities – Threatpost
T
Tenable Blog
月光博客
月光博客
P
Privacy & Cybersecurity Law Blog
P
Privacy International News Feed
K
Kaspersky official blog
Scott Helme
Scott Helme
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
N
News and Events Feed by Topic
T
The Exploit Database - CXSecurity.com
N
News and Events Feed by Topic
有赞技术团队
有赞技术团队
Recent Commits to openclaw:main
Recent Commits to openclaw:main
L
LINUX DO - 最新话题
Recorded Future
Recorded Future
Application and Cybersecurity Blog
Application and Cybersecurity Blog
Help Net Security
Help Net Security
The GitHub Blog
The GitHub Blog
Cisco Talos Blog
Cisco Talos Blog
SecWiki News
SecWiki News
P
Proofpoint News Feed
Security Latest
Security Latest
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
罗磊的独立博客
S
Security Affairs
M
MIT News - Artificial intelligence
L
LINUX DO - 热门话题
美团技术团队
Simon Willison's Weblog
Simon Willison's Weblog
T
Threat Research - Cisco Blogs
Stack Overflow Blog
Stack Overflow Blog
Forbes - Security
Forbes - Security
Hugging Face - Blog
Hugging Face - Blog
博客园 - Franky
V
Visual Studio Blog

博客园 - 水手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;
}