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

原文地址:https://www.cnblogs.com/keatkeat/p/11332475.html

时间: 2024-08-02 18:24:42

decimal, double, float的相关文章

c#中decimal ,double,float的区别

转自:http://www.cnblogs.com/lovewife/articles/2466543.html 单精度就是指4个字节的浮点数,即float双精度就是指8个字节的浮点数,即double decimal是高精度 浮点型 Name CTS Type Description Significant Figures Range (approximate) float System.Single 32-bit single-precision floating point 7 ±1.5 ×

iOS Objective-C How to get 2 decimal rounded float value?

Have you tried this? CGFloat val = 37.777779;CGFloat rounded_down = floorf(val * 100) / 100; /* Result: 37.77 */CGFloat nearest = floorf(val * 100 + 0.5) / 100; /* Result: 37.78 */CGFloat rounded_up = ceilf(val * 100) / 100; /* Result: 37.78 */source

double float的精度问题

三部曲 1: #include <iostream> #include <stdio.h> #include <string.h> using namespace std; int main() { double a=0.0001; float b=0.1; int c=(int)(a*1000)/b; cout<<c<<endl; } ///期望c==1 结果c却==0 2: #include <iostream> #include

iOS - Json解析精度丢失处理(NSString, Double, Float)

开发中处理处理价格金额问题, 后台经常返回float类型, 打印或转成NSString都会有精度丢失问题, 因此使用系统自带的NSDecimalNumber做处理, 能解决这问题:经过测试其实系统NSDecimalNumber是对有问题值做了四舍五入处理 ?    还有经过测试, 重要的事说三遍:?处理精度有关的数据请用double?处理精度有关的数据请用double?处理精度有关的数据请用double     float testDouble = [jsonDict[@"Body"]

Decimal、 Float、 Double 使用

一.Java 1.float型定义的数据末尾必须 有"f "或"F",为了和double区别.例float x=123.456f,  y=2e20f; public static void main(String[] args) { System.out.println(0.08f + 0.01f); } 输出: 0.089999996 2.精确计算中我们要用java.math.BigDecimal class DecimalUtil{ private static

1不等于1?numeric、decimal、float 和 real 数据类型的区别

大家有没有在SQL中遇见1不等于1(1<>1)的情形!?下面会有一个例子演示这个情形. 先简单介绍一下标题中的四种数值数据类型. 在T-SQL中,numeric和decimal是精确数值数据类型,而float和real是近似数值数据类型. numeric和decimal是等同的.real等同于float(24). 在定义一个float(n)类型列的时候,如果明确指定了n的值,例如 val float(10) 那么当n的值在1-24之间,系统会将该列(val)标记为real类型:当n的值在25-

TSQL - Decimal, Numeric, Float &amp; Real

在SQL Server中数值类型有多种不同的分法,其中一种就是:精确类型和近似类型.其中近似类型其实只有两种数据类型:Float和Real. 在我们的数据库设计中如果设计到需要存储非整形数值的时候,很多时候我们都会疑惑到底需要用下面数据类型的哪个: Float Real Decimal Numeric 说开来其实很简单,上面4个类型其实只有两种类型: 1)     Float & Real 他们都是表示浮点数的数值类型,而且是一种近似数值表示,Real是Float的一种特殊形式. Float的语

Java中浮点类型的精度问题 double float

要说清楚Java浮点数的取值范围与其精度,必须先了解浮点数的表示方法与浮点数的结构组成.因为机器只认识01,你想表示小数,你要机器认识小数点这个东西,必须采用某种方法.比如,简单点的,float四个字节,前两个字节表示整数位,后两个字节表示小数位(这就是一种规则标准),这样就组成一个浮点数.而Java中浮点数采用的是IEEE 754标准. IEEE 754 标准 更多详见:https://baike.baidu.com/item/IEEE%20754 IEEE 754 标准是IEEE二进位浮点数

Java中的浮点型(Double&amp;Float)计算问题

在刚刚做完的一个项目中,遇到了double型计算不精确的问题.到网上查找后,问题得到解决.经验共享,在这里总结一下. Java中的浮点数类型float和double不能够进行精确运算.这个问题有时候非常严重.比如,经过double型直接计算,1.4×1.5有时会得出2.0999999999999996的结果,但实际上,应该得到2.10.而且,类似的情况并不仅限于乘法计算. 在有的编程语言中提供了专门的货币类型来处理这种情况,但是Java没有.所以,在商业计算中我们要用:java.math.Big