第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

將 json 解組為浮動(dòng)。為什么需要 float64?

將 json 解組為浮動(dòng)。為什么需要 float64?

Go
翻閱古今 2023-07-31 15:58:50
我注意到 go unmarshals json floats 的方式有一些奇怪的行為。有些數(shù)字(但不是全部)拒絕正確解組。解決這個(gè)問(wèn)題就像在目標(biāo)變量中使用 float64 而不是 float32 一樣簡(jiǎn)單,但我一生都找不到出現(xiàn)這種情況的充分理由。這是演示該問(wèn)題的代碼:package mainimport (    "encoding/json"    "fmt"    . "github.com/shopspring/decimal")func main() {    bytes, _ := json.Marshal(369.1368) // not every number is broken, but this one is    fmt.Println("bytes", string(bytes))    var f32 float32    json.Unmarshal(bytes, &f32)    fmt.Printf("f32 %f\n", f32) // adds an extra 0.00001 to the number    var d Decimal    json.Unmarshal(bytes, &d)    fmt.Printf("d %s\n", d) // 3rd party packages work    // naw, you can just float64    var f64 float64    json.Unmarshal(bytes, &f64)    fmt.Printf("f64 %f\n", f64) // float64 works}不需要 float64 來(lái)準(zhǔn)確表示我的示例數(shù)字,那么為什么這里需要呢?去游樂(lè)場(chǎng)鏈接:https://play.golang.org/p/tHkonQtZoCt
查看完整描述

1 回答

?
30秒到達(dá)戰(zhàn)場(chǎng)

TA貢獻(xiàn)1828條經(jīng)驗(yàn) 獲得超6個(gè)贊

您的斷言是錯(cuò)誤的:不能369.1368精確表示。?float32?float64

最接近的float32值是(大約)369.136810302734375,它四舍五入到369.13681您的額外數(shù)字的來(lái)源。最接近的float64值是(大約)369.13679999999999382,它更適合您的目的。

(當(dāng)然,如果您將其中任何一個(gè)四舍五入到小數(shù)點(diǎn)后四位數(shù)字,您就會(huì)得到您期望的數(shù)字。)

表示Decimal是精確的:沒(méi)有舍入誤差。

JSON 傳輸和接收以十進(jìn)制表示的浮點(diǎn)值,但實(shí)際實(shí)現(xiàn)以各種語(yǔ)言表示,然后以不同的方式對(duì)這些數(shù)字進(jìn)行編碼。根據(jù)您通過(guò) JSON 通信的實(shí)體類型,通過(guò)編碼和解碼Decimal可以完全按照您的意愿保留數(shù)字,但請(qǐng)注意,用 C++ 或 Python 編寫(xiě)的程序可能會(huì)將您的數(shù)字解碼為不同的浮點(diǎn)數(shù)-點(diǎn)精度并引入各種舍入誤差。

此 Go Playground 示例使用新添加的%x格式,并向您展示數(shù)字如何在內(nèi)部存儲(chǔ):

作為 float32 = 369.13681030273437500 (float32),這實(shí)際上是 12095875p-15 或 0x1.712306p+08

和:

作為 float64 = 369.136799999999999382 (float64),實(shí)際上是 6493923261440380p-44 或 0x1.712305532617cp+08

也就是說(shuō),數(shù)字 369。無(wú)論內(nèi)部以二進(jìn)制表示。它在 2?8?= 256 和 2?9?= 512 之間。在二進(jìn)制中,它是 1 256、無(wú) 128、1 64、1 32、1 16、無(wú) 8、無(wú) 4、無(wú) 2 和 1 1:1.01110001 某物x?2?8。格式%b以一種方式表達(dá)%x,另一種格式以(1 . 0111 0010)%x開(kāi)頭。1.72

查看完整回答
反對(duì) 回復(fù) 2023-07-31
  • 1 回答
  • 0 關(guān)注
  • 127 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)