据我所知 int64 可以在 Go 中的 float64 中转换,语言允许使用float64(some_int64_variable),但我也知道并非所有 64 位有符号整数都可以用 double 表示(因为 IEE754 近似值)。
我们有一些代码可以使用美分接收商品的价格int64并执行类似的操作
const TB = 1 << 40
func ComputeSomething(numBytes int64) {
Terabytes := float64(numBytes) / float64(TB)
Run Code Online (Sandbox Code Playgroud)
我想知道这有多安全,因为并非所有整数都可以用双精度表示。
回答“安全吗”确实需要更好地了解您的需求,以及您究竟如何处理这些数字。因此,让我们问一个相关但更精确的问题,我们可以肯定地回答:
不能精确表示的最小正整数值是多少
float64?
因为int64,这个数字原来是9007199254740993。float64这是“跳过”的第一个整数。
这可能看起来相当大,而且也许并不那么令人震惊。(如果这些是“美分”,那么我相信大约是 90 万亿美元左右。)但是如果您使用单精度浮点数,答案可能会让您感到惊讶。如果您使用float32,则该数字为:16777217。如果按美分计算,约为 168,000 美元。幸好你没有使用单精度浮点数!
根据经验,您永远不应该使用float类型(无论其精度如何)来处理金钱。浮点数实际上并不是像离散量那样为“金钱”而设计的,而是处理科学应用中出现的小数值。舍入误差可能会逐渐增加,从而影响您的计算。请改用大整数表示形式。大整数实现可能会更慢,因为它们主要是在软件中实现的,但如果您正在处理金钱计算,我冒昧地猜测您并不真正需要硬件可以提供的浮点计算速度。