decimal, double, float
更新: 2019-09-08
c# and js 要 ceil floor 2 decimal point 都没有 build in 的 solution
比如 15.667 想 ceil to 15.67
做法是 Math.Ceilling(15.667 * 100) / 100
先做一个乘 100 然后除 100
js 的用 big.js
refers :
http://blog.leanote.com/post/weibo-007/mysql_float_double_decimal
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://stackoverflow.com/questions/149055/how-can-i-format-numbers-as-currency-string-in-javascript
https://rockyee.iteye.com/blog/891538
https://blog.csdn.net/qianlong4526888/article/details/8508012
https://www.jianshu.com/p/87627d53f77b
人做计算的时候用的是 十进制, 电脑计算和存储的时候用的是二进制
十进制转换成二进制是 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
或者它的姐妹 big.js 和 bignumber.js 也ok
我目前用的是 big.js 因为比较轻.
big.js 默认的 round 是四舍五入
舍入有很多种方式哦
我以前只知道 四舍五入...
Half Round Up 经典的四舍五入
Half Round Down 五舍六入
Half Round Up negetive 听过 netegive 的 round 吗? 哈哈 !
-7.5 to -7,-7.6 to -8 (这里的 up 方向是往 positive )
Hlaf Round Down negetive
-7.4 to -7,-7.5 to -8
Round Half Away From 0 (远离 0)
7.5 to 8,-7.5 to -8
Round Half Towards 0
7.5 to 7,-7.5 to -7
Round to Even
7.5 to 8(因为 8 是 even 所以四舍五入),6.5 to 6(因为 7 不是 even,所以五舍四入)
Round to Odd
7.5 to 7(因为 8 不是 odd 所以五舍四入),6.5 to 7(因为 7 是 odd,所以四舍五入)
c# 和 sql decimal 转换
c# 可以装 28 小数位置, 前后 dynamic
比如 0.123.... 小数后 28 位
或者 12.123... 小数后 27 位
它很灵活的, 反观 sql server
sql server 是 set 死的,
比如
decimal(29,28) 对应 0.123
decimal(29,27) 对应 12.123
sql server 总数可以渠道 38, 所以要尽可能对上 c# 也只能是 decimal (38,28) 前面 10位,后面 28位
所以呢, 当我们在使用 decimal 做算法是要特别敏感一些.
一种方式是定义好 decimal 的小数, 在 c# 先 round to 指定的小数后才使用. 这样 c# 和 sql 就统一了
二就是定义 38,28 等报错才处理. 毕竟10位不小. 很少遇到问题。重要是小数后好保留好,比如做除法经常就有除不完的 case
如果你 sql 保留的少于 c# 那么之后就会丢失掉那些小数了。
中小企业项目通常的做法.
首先我们得对小数点敏感。
加减乘 int 是不会出现小数点得,除非其中一个数有小数点
除法就很有可能会产生小数点了.
加减的情况下,小数点只会变得更少,因为进位嘛
乘法就可能会有小数点变多的情况, 比如 1.22 * 1.33, 乘法其中一个是 int 就不会变多,只会变少
加减乘是不会无穷小数点的, 即便在乘 < 0 也不会无穷
只有除会产生无穷小数点.
我们在做计算得时候要要想清楚每一次的场景,要 round to 几位置确保人算和电脑一样。不然就会非常混乱了. 不要想说电脑能保留多少小数就保留咯...电脑是会升级的.,所以不要依赖这个,自己决定,自己 round.
decimal, double, float的更多相关文章
- C#中decimal ,double,float的区别
浮点型 Name CTS Type Description Significant Figures Range (approximate) float System.Single 32-bit sin ...
- [转载] c#中decimal ,double,float的区别
一直很奇怪C#的预定义数据类型中为什么加了一个decimal,有float和double不就够了吗?今天来挖一挖. 浮点型 Name CTS Type De script ion Significan ...
- decimal,float和double的区别
http://www.cnblogs.com/yellowapplemylove/archive/2011/08/23/2150316.html 一直很奇怪C#的预定义数据类型中为什么加了一个deci ...
- decimal与float和double的区别
一直很奇怪C#的预定义数据类型中为什么加了一个decimal,有float和double不就够了吗?今天来挖一挖. 浮点型 Name CTS Type De script ion Significan ...
- java中浮点数的比较(double, float)(转)
问题的提出:如果我们编译运行下面这个程序会看到什么? public static void main(String args[]){ System.out.println(0.05+0.01); Sy ...
- mysql基础之double,float长度标度定义
MySQL类型float double decimal的区别 float数值类型用于表示单精度浮点数值,而double数值类型用于表示双精度浮点数值,float和double都是浮点型,而decima ...
- impala支持的数据库里的double(float)类型,通过迁移inceptor后,类型的值都变成了null
impala支持的数据库里的double(float)类型,通过迁移inceptor后,double类型的值都变成了null. 通过查阅日志发现默认将double转换成Decimal(38,10)然而 ...
- Java 浮点数精确性探讨(IEEE754 / double / float)与 BigDecimal 解决方案
一.抛砖引玉 一个简单的示例: double a = 0.0; IntStream.range(0,3).foreach(i->a+=0.1); System.out.println(a); / ...
- iOS - Json解析精度丢失处理(NSString, Double, Float)
开发中处理处理价格金额问题, 后台经常返回float类型, 打印或转成NSString都会有精度丢失问题, 因此使用系统自带的NSDecimalNumber做处理, 能解决这问题:经过测试其实系统NS ...
随机推荐
- Spring Boot 中 Druid 的监控页面配置
Druid的性能相比HikariCp等其他数据库连接池有一定的差距,但是数据库的相关属性的监控,别的连接池可能还追不上,如图: 今天写一下 Spring Boot 中监控页面的配置,我是直接将seat ...
- POI的XWPFTable的方法总结
1. void addNewCol(): 为该表中的每一行添加一个新列 2. void addRow(XWPFTableRow row): 向表中添加新行 3. boolean addRow(XWP ...
- Truffle测试框架
Truffle测试框架 2018年06月08日 19:01:19 tianlongtc 阅读数 1000 Truffle 有一个标准的自动化测试框架,让你可以非常方便地测试您的合约.这个框架允许您 ...
- php 的生命周期
1.PHP的运行模式: PHP两种运行模式是WEB模式.CLI模式.无论哪种模式,PHP工作原理都是一样的,作为一种SAPI运行. 1.当我们在终端敲入php这个命令的时候,它使用的是CLI. 它就像 ...
- uwsgi+nginx部署django项目
1. 概念解析(wsgi协议,uwsgi协议,uWSGI) 参考:https://www.cnblogs.com/wspblog/p/8575101.html 1.1 现实世界的web请求: 1.2 ...
- [Java复习] Spring Boot
什么是Spring Boot? 传统SSH/SSM框架配置繁琐,有很多重复的模板配置,效率不高. Spring Boot快速创建可独立运行,生产级别的Spring应用程序. 主要是基于Spring家族 ...
- 轻量级通用上采样算子-CARAFE
转载:https://zhuanlan.zhihu.com/p/76063768 前言 这篇论文被 ICCV 2019 接收为 oral presentation.之前我们主要研究物体检测(例如 Hy ...
- nginx虚拟机无法访问解决
.重要:修改配置文件使用虚拟机,否则怎么配置都不生效,添加如下用户 [root@host---- html]# ll /etc/nginx/nginx.conf -rw-r--r-- root roo ...
- RabbitMQ运转流程
生产者发送消息的过程 生产者连接到RabbitMQ Broker(相当于是一个RabbitMQ服务器),建立一个连接(Connection),开启一个信道(Channel). 生产者声明一个交换器(E ...
- JDK1.8新特性之Optional
概念 Optional 是JDK1.8中出现的一个容器类,代表一个值存在或者不存在.原来使用null表示一个值不存在,现在Optional可以更好的表达这个概念.并且可以避免空指针异常. 场景分析 需 ...