从int64转换为float64是否安全?

据我所知,int64 可以在 Go 中的 float64 中转换,该语言允许这样做,但我也知道并非所有 64 位有符号整数都可以用双精度表示(因为 IEE754 近似)。float64(some_int64_variable)


我们有一些代码,可以使用以美分为单位接收商品的价格,并执行类似操作int64


const TB                    = 1 << 40


func ComputeSomething(numBytes int64) {

    Terabytes := float64(numBytes) / float64(TB)

我想知道这有多安全,因为并非所有整数都可以用双精度表示。


扬帆大鱼
浏览 415回答 2
2回答

SMILET

取决于你所说的“安全”是什么意思。是的,在某些情况下,精度可能会丢失。 不能精确地表示 的所有值(因为它只有 53 位尾数)。因此,如果您需要完全准确的结果,则此函数不是“安全的”;如果你想代表金钱,你可能会遇到麻烦。float64int64float64另一方面,您真的需要绝对精确的TB数吗?实际上会精确除以吗?这不太可能,但这完全取决于您的规格和需求。如果您的代码具有字节计数器,并且您希望显示大约多少TB(例如0.05 TB或2.124 TB),则此计算没有问题。numBytesTB

慕沐林林

回答“安全吗”确实需要更好地了解您的需求,以及您如何处理这些数字。因此,让我们问一个相关但更精确的问题,我们可以肯定地回答:不能准确表示的最小正整数值是多少?float64对于 ,这个数字原来是 。这是第一个“跳过”的整数。int649007199254740993float64这可能看起来很大,也许不那么令人担忧。(如果这些是“美分”,那么我相信它大约是90万亿美元左右。但是,如果您使用单精度浮点数,答案可能会让您大吃一惊。如果使用 ,则该数字为:。大约168千美元,如果解释为美分。好在你没有使用单精度浮子!float3216777217根据经验,你永远不应该使用类型(无论它有多精确)来处理金钱。浮点数实际上不是像离散量那样为“货币”而设计的,而是处理科学应用中出现的分数值。舍入误差可能会逐渐增加,从而抛弃您的计算。请改用大整数表示形式。大整数实现可能会更慢,因为它们主要是在软件中实现的,但是如果你正在处理货币计算,我冒昧地猜测你并不需要硬件可以提供的浮点计算速度。float
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go