为了账号安全,请及时绑定邮箱和手机立即绑定

从int64转换为float64是否安全?

从int64转换为float64是否安全?

Go
扬帆大鱼 2022-08-15 17:30:01
据我所知,int64 可以在 Go 中的 float64 中转换,该语言允许这样做,但我也知道并非所有 64 位有符号整数都可以用双精度表示(因为 IEE754 近似)。float64(some_int64_variable)我们有一些代码,可以使用以美分为单位接收商品的价格,并执行类似操作int64const TB                    = 1 << 40func ComputeSomething(numBytes int64) {    Terabytes := float64(numBytes) / float64(TB)我想知道这有多安全,因为并非所有整数都可以用双精度表示。
查看完整描述

2 回答

?
SMILET

TA贡献1796条经验 获得超4个赞

取决于你所说的“安全”是什么意思。

是的,在某些情况下,精度可能会丢失。 不能精确地表示 的所有值(因为它只有 53 位尾数)。因此,如果您需要完全准确的结果,则此函数不是“安全的”;如果你想代表金钱,你可能会遇到麻烦float64int64float64

另一方面,您真的需要绝对精确的TB数吗?实际上会精确除以吗?这不太可能,但这完全取决于您的规格和需求。如果您的代码具有字节计数器,并且您希望显示大约多少TB(例如0.05 TB或2.124 TB),则此计算没有问题。numBytesTB


查看完整回答
反对 回复 2022-08-15
?
慕沐林林

TA贡献2016条经验 获得超9个赞

回答“安全吗”确实需要更好地了解您的需求,以及您如何处理这些数字。因此,让我们问一个相关但更精确的问题,我们可以肯定地回答:

不能准确表示的最小正整数值是多少?float64

对于 ,这个数字原来是 。这是第一个“跳过”的整数。int649007199254740993float64

这可能看起来很大,也许不那么令人担忧。(如果这些是“美分”,那么我相信它大约是90万亿美元左右。但是,如果您使用单精度浮点数,答案可能会让您大吃一惊。如果使用 ,则该数字为:。大约168千美元,如果解释为美分。好在你没有使用单精度浮子!float3216777217

根据经验,你永远不应该使用类型(无论它有多精确)来处理金钱。浮点数实际上不是像离散量那样为“货币”而设计的,而是处理科学应用中出现的分数值。舍入误差可能会逐渐增加,从而抛弃您的计算。请改用大整数表示形式。大整数实现可能会更慢,因为它们主要是在软件中实现的,但是如果你正在处理货币计算,我冒昧地猜测你并不需要硬件可以提供的浮点计算速度。float


查看完整回答
反对 回复 2022-08-15
  • 2 回答
  • 0 关注
  • 414 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信