decimal, double, float

Posted keatkeat

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了decimal, double, float相关的知识,希望对你有一定的参考价值。

 

refers : 

http://blog.leanote.com/post/weibo-007/mysql_float_double_decimal

https://brooch.me/2016/11/17/%E6%B5%AE%E7%82%B9%E6%95%B0%E8%AE%A1%E7%AE%97%E4%B8%BA%E4%BB%80%E4%B9%88%E4%B8%8D%E7%B2%BE%E7%A1%AE/

https://frontstuff.io/how-to-handle-monetary-values-in-javascript

https://www.html.cn/archives/7340

https://github.com/sarahdayan/dinero.js

https://stackoverflow.com/questions/1165761/decimal-vs-double-which-one-should-i-use-and-when

https://stackoverflow.com/questions/803225/when-should-i-use-double-instead-of-decimal

https://www.zhihu.com/question/65960911

https://exceptionnotfound.net/decimal-vs-double-and-other-tips-about-number-types-in-net/

https://currency.js.org/

https://stackoverflow.com/questions/149055/how-can-i-format-numbers-as-currency-string-in-javascript

https://rockyee.iteye.com/blog/891538

 

人做计算的时候用的是 十进制, 电脑计算和存储的时候用的是二进制 

十进制转换成二进制是 ok 的, 只要没有小数点.

有小数点的时候就麻烦了, 比如 

javascript 0.1 + 0.2 === 0.3 // false 结果会是 0.3xxxxxxx 后面多了很多数字

其原因就是因为 0.1 的二进制是一个无限数字... double 用 64 位来记入数字, 肯定就丢失了后面的信息...转回十进制的时候就出现了偏差. 

要解决这个问题,通常就是不要使用十进制小数点来运算,通过升级降级 ((0.1 x 10) + (0.2 x 10) ) / 10 就可以得到准确的数字了. 

在真实的实现过程里,我们不能直接拿 0.1 x 10, 因为这个也是一个运算,依然会错。我们得用 string 然后自己把小数点移动去后面,然后再转换成数字 

c# 的 decimal 就是替我们干了这些事儿. 而 js 目前没有 decimal,只能靠库帮忙了.

 

decimal 的特点是慢, 能处理的数字小. 

double 就快, 但是不精准. (这个不精准是指,当用于十进制的运算时不精准)

那么什么时候用 decimal or double 呢? 

如果你要计算东西,而这个东西的结果是可能被"人"拿来计算的, 那么我们就应该使用 decimal 

比如:钱,积分 等等

那么 double 更多使用的场景是在游戏,图形,科学等地方。需要数字很大,运算快,但是有可以有偏差的地方。

 

js 库

https://github.com/MikeMcl/decimal.js

 

以上是关于decimal, double, float的主要内容,如果未能解决你的问题,请参考以下文章

Decimal.Parse 和 Double.Parse System.FormatException 不同的行为

float,double和decimal类型

C# float 、double和decimal的解释

应该将 xs:double 转换为 xs:decimal 实现为 BigDecimal.valueOf(double) 还是 new BigDecimal(double)?

Newtonsoft JSON- 与 DataSet 的转换导致 Decimal 变为 Double?

decimal and double ToString problem