C# float 、double和decimal的解释

Posted

tags:

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

他们的范围各自是多少?越详细越好!

float 单精度浮点 32bit,
double 双精度浮点64bit,
decimal是高精度 128bit,浮点型。
float double 是 基本类型(primitive type),decimal不是。
float 有效数字7位,范围 ±1.5 × 10E−45 to ±3.4 × 10E38
double 有效数字15/16 位,范围 ±5.0 × 10 E−324 to ±1.7 × 10E308
decimal 有效数字 28/29 位,范围 ±1.0 × 10E−28 to ±7.9 × 10E28
( E -- 下接几次方)

decimal的有效位数很大,达到了28位,但是表示的数据范围却比float和double类型小。
使用的时候会对计算时的性能有影响。
常数写法:
float f = 12.3F; (带F)
double x=12.3; (不带就是double)
decimal d = 12.30M; (带M)

浮点数运算会有精度损失问题,有精度损失时程序不会报告,要程序员自己注意。
参考技术A float是单精度,double是双精度,decimal是数字型,它们所占的内存空间不一样,表示的位数也不一样。除了科学计算以外,一般不用double型的。对于数字(包括小数)一般用decimal型的。
这是基本上的拉。

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

 

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

c#中decimal ,double,float的区别

decimal,float和double的区别是啥?

float,double和decimal类型

MySQL类型float double decimal的区别

C#如何把INT类型转换为方法参数对应的枚举类型?怎么强制转换?

MySQL中Decimal类型和Float Double的区别