decimal, double, float

 更新: 2019-09-08 javascript

c# and js 要 ceil floor 2 decimal point 都沒有 build in 的 solutionhtml

好比 15.667 想 ceil to 15.67 java

作法是 Math.Ceilling(15.667 * 100) / 100 mysql

先作一個乘 100 而後除 100git

js 的用 big.jsgithub

new Big(15.667).round(2, RoundingMode.RoundUp)

 

 

 

refers : 算法

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

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/c#

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

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

https://blog.csdn.net/qianlong4526888/article/details/8508012

https://www.jianshu.com/p/87627d53f77b

https://stackoverflow.com/questions/3152439/what-is-a-good-mapping-of-net-decimal-to-sql-server-decimal

 

人作計算的時候用的是 十進制, 電腦計算和存儲的時候用的是二進制 

十進制轉換成二進制是 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 轉換 

https://stackoverflow.com/questions/3152439/what-is-a-good-mapping-of-net-decimal-to-sql-server-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.

相關文章
相關標籤/搜索