一尘不染

转到:使用乘数将float64转换为int

go

我想将float64数字转换1.0031003(整数类型)。我的实现方式是简单地将float64with 1000与转换为int

package main

import "fmt"


func main() {
  var f float64 = 1.003
  fmt.Println(int(f * 1000))
}

但是,当我运行该代码时,我得到的1002不是1003。因为Go自动将1.003as
存储1.002999...在变量中。在Golang上执行此类操作的正确方法是什么?


阅读 368

收藏
2020-07-02

共1个答案

一尘不染

转到规格:转化:

数字类型之间的转换

将浮点数转换为整数时,将舍弃小数(截断为零)。

因此,基本上,当您将浮点数转换为整数时,仅保留整数部分。

如果您只是想避免因用有限位表示而引起的错误,请在将0.5数字转换为之前添加到数字int。不需要外部库或函数调用(来自标准库)。

由于float -> int转换 不是舍入 而是 保留整数部分 ,这将为您提供所需的结果。考虑到可能更大或更小的表示形式:

1002.9999 + 0.5 = 1003.4999;     integer part: 1003
1003.0001 + 0.5 = 1003.5001;     integer part: 1003

所以只需写:

var f float64 = 1.003
fmt.Println(int(f * 1000 + 0.5))

要将其包装到函数中:

func toint(f float64) int {
    return int(f + 0.5)
}

// Using it:
fmt.Println(toint(f * 1000))

Go Playground上尝试一下。

注意:

当您使用负数时请小心!例如,如果您的值为-1.003,则可能希望结果为-1003。但是,如果添加0.5到它:

-1002.9999 + 0.5 = -1002.4999;     integer part: -1002
-1003.0001 + 0.5 = -1002.5001;     integer part: -1002

因此,如果您有负数,则必须:

  • 减去0.5而不是加
  • 或从结果中0.5减去1

将其整合到我们的辅助函数中:

func toint(f float64) int {
    if f < 0 {
        return int(f - 0.5)
    }
    return int(f + 0.5)
}
2020-07-02