成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

在Go中使用接口:實(shí)用性與脆弱性的平衡

開發(fā) 前端
處理貨幣時(shí) — 使用 math/big? 或一些與貨幣相關(guān)的庫,比如 shopspring/decimal,或者只是使用貨幣單位,在這里不要使用浮點(diǎn)數(shù)。將貨幣作為字符串傳遞,或者在貨幣單位中傳遞,不要在這里使用浮點(diǎn)數(shù)。

在開發(fā)的初始階段,我們經(jīng)常會(huì)遇到“浮點(diǎn)數(shù)精度”和“貨幣值表示”的問題。

那么,如何處理貨幣,如何存儲(chǔ)和傳遞它們。

為什么是問題?

Go語言中的標(biāo)準(zhǔn)浮點(diǎn)類型具有一定的精度(像其他任何語言一樣),你不能在貨幣操作中使用它們。這里有一個(gè)最簡(jiǎn)單的例子:

var v1, v2 = 0.1, 0.2
fmt.Println(v1 + v2)
// 輸出:0.30000000000000004

你可以計(jì)算你需要將一個(gè)值與另一個(gè)值相加多少次,才能在你的賬戶上獲得額外的錢!但反過來也是一樣 — 在這種情況下,你只是失去了你的錢。

這不僅在對(duì)你的錢進(jìn)行數(shù)學(xué)運(yùn)算時(shí)有問題,而且在不同系統(tǒng)或服務(wù)之間傳遞數(shù)據(jù)時(shí)也是有問題的。

下一個(gè)問題 — 傳遞你的錢

每次將你的錢從/到浮點(diǎn)數(shù)進(jìn)行編組時(shí),都會(huì)遇到與上述相同的問題,以及與編組器實(shí)現(xiàn)有關(guān)的其他問題 - json,xml,text等等...

另一個(gè)問題是四舍五入。如果你處理的是貨幣,你總會(huì)面臨四舍五入的問題。你應(yīng)該如何四舍五入你的貨幣值?例如 0.345 元,一般我們還是會(huì)四舍五入到 0.35 元?

我們的選擇是什么?

有一些特殊的類型可用于貨幣的表示和計(jì)算。

Go標(biāo)準(zhǔn)庫有 big.Float 類型(來自 math/big 包,表示任意精度的浮點(diǎn)數(shù))。與 float32 和 float64 不同,它們具有固定的大小和精度,big.Float 允許你為數(shù)字和計(jì)算設(shè)置任意精度。

另一個(gè)不錯(cuò)的選擇是 decimal 庫 (https://github.com/shopspring/decimal)。

關(guān)于四舍五入:

  • 1.234 => 1.23
  • 1.235 => 1.24
  • 1.236 => 1.24

例如,shopspring/decimal 提供了適當(dāng)舍入值的方法。

考慮的另一個(gè)好選擇是使用貨幣單位。這樣,你就從浮點(diǎn)數(shù)問題轉(zhuǎn)移到整數(shù),并將一切都作為整數(shù)計(jì)算。在這里唯一使用四舍五入的地方:傳遞結(jié)果值。

現(xiàn)在讓我們討論一下在傳遞貨幣時(shí)的選擇。

  • 使用貨幣單位 — 我們將所有內(nèi)容都傳遞為整數(shù),這里沒有浮點(diǎn)問題。只需控制值的限制,就可以了。
  • 將浮點(diǎn)數(shù)作為字符串傳遞。通常也是一個(gè)不錯(cuò)的選擇 — 當(dāng)你將浮點(diǎn)數(shù)作為字符串傳遞時(shí),帶有所需精度(特定小數(shù)位數(shù))的字符串,當(dāng)對(duì)方讀取此字符串值并將其轉(zhuǎn)換回浮點(diǎn)數(shù)時(shí),你就是安全的。

簡(jiǎn)單的例子

你可以在 Go Playground 上嘗試一下。

package main

import (
    "fmt"
    "github.com/shopspring/decimal"
)

func main() {
    a := 0.1
    b := 0.2
    c := decimal.NewFromFloat(a)
    d := decimal.NewFromFloat(b)
    fmt.Println(a, b, c.String(), d.String()) 
    fmt.Println(a + b) 
    fmt.Println(c.Add(d).String()) 
}

輸出為:

0.1 0.2 0.1 0.2
0.30000000000000004
0.3

結(jié)論

處理貨幣時(shí) — 使用 math/big 或一些與貨幣相關(guān)的庫,比如 shopspring/decimal,或者只是使用貨幣單位,在這里不要使用浮點(diǎn)數(shù)。將貨幣作為字符串傳遞,或者在貨幣單位中傳遞,不要在這里使用浮點(diǎn)數(shù)。

責(zé)任編輯:武曉燕 來源: 愛發(fā)白日夢(mèng)的后端
相關(guān)推薦

2012-12-25 10:53:09

2010-11-08 09:43:47

2021-07-16 16:53:42

無人機(jī)評(píng)估威脅

2010-01-08 12:11:04

ibmdwWeb

2022-08-09 07:08:28

函數(shù)式編程Go

2022-05-27 05:42:34

容器云安全

2011-05-31 18:41:45

復(fù)印機(jī)技巧

2013-09-09 11:41:18

天融信漏洞掃描TopScanner

2010-05-27 12:56:26

2016-12-16 09:37:33

Linux實(shí)用性 行動(dòng)

2023-07-17 13:44:23

2016-12-08 08:35:30

2017-03-22 13:45:00

驅(qū)動(dòng)器服務(wù)器

2023-06-25 14:44:27

2021-01-17 16:25:02

Python編程語言開發(fā)

2013-05-30 09:19:31

災(zāi)難恢復(fù)故障排查運(yùn)維

2011-11-03 10:35:52

2017-08-12 13:36:15

虛擬化災(zāi)難恢復(fù)服務(wù)器

2011-11-02 17:30:36

HTML 5

2023-12-20 07:52:49

Python高級(jí)用法生成器
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 国产欧美一区二区三区免费 | 免费在线观看成年人视频 | 国产农村一级片 | 精品国产乱码久久久久久88av | 国产精品久久久久久婷婷天堂 | 亚洲精品美女视频 | 婷婷在线网站 | 国产高清免费 | 精品九九| 在线观看成人 | 欧美全黄| 午夜视频在线观看视频 | 91精品国产91久久久久青草 | 亚洲国产精品一区二区三区 | 欧美日韩国产精品一区二区 | 久久蜜桃精品 | 日一区二区三区 | 在线免费黄色小视频 | 亚洲精品日韩在线 | 日日夜精品视频 | 懂色中文一区二区三区在线视频 | 欧美一区二区三区高清视频 | 一级欧美一级日韩片免费观看 | 午夜久久久 | 亚洲精品1区 | 丁香婷婷久久久综合精品国产 | 狠狠爱一区二区三区 | 国产精品久久久久久久久久久久 | 一级片片 | 综合二区 | 女生羞羞视频 | 一区二区视频在线观看 | 国产一区欧美 | 国产一级成人 | 国产一级片在线播放 | 91就要激情| 电影午夜精品一区二区三区 | 久久久久成人精品亚洲国产 | 日韩电影免费观看中文字幕 | 中文字幕精品一区 | 精品一区av |