据我所知,int64 可以在 Go 中的 float64 中转换,该语言允许这样做,但我也知道并非所有 64 位有符号整数都可以用双精度表示(因为 IEE754 近似)。float64(some_int64_variable)我们有一些代码,可以使用以美分为单位接收商品的价格,并执行类似操作int64const TB = 1 << 40func ComputeSomething(numBytes int64) { Terabytes := float64(numBytes) / float64(TB)我想知道这有多安全,因为并非所有整数都可以用双精度表示。
2 回答
慕沐林林
TA贡献2016条经验 获得超9个赞
回答“安全吗”确实需要更好地了解您的需求,以及您如何处理这些数字。因此,让我们问一个相关但更精确的问题,我们可以肯定地回答:
不能准确表示的最小正整数值是多少?
float64
对于 ,这个数字原来是 。这是第一个“跳过”的整数。int64
9007199254740993
float64
这可能看起来很大,也许不那么令人担忧。(如果这些是“美分”,那么我相信它大约是90万亿美元左右。但是,如果您使用单精度浮点数,答案可能会让您大吃一惊。如果使用 ,则该数字为:。大约168千美元,如果解释为美分。好在你没有使用单精度浮子!float32
16777217
根据经验,你永远不应该使用类型(无论它有多精确)来处理金钱。浮点数实际上不是像离散量那样为“货币”而设计的,而是处理科学应用中出现的分数值。舍入误差可能会逐渐增加,从而抛弃您的计算。请改用大整数表示形式。大整数实现可能会更慢,因为它们主要是在软件中实现的,但是如果你正在处理货币计算,我冒昧地猜测你并不需要硬件可以提供的浮点计算速度。float
- 2 回答
- 0 关注
- 414 浏览
添加回答
举报
0/150
提交
取消