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

Wen*_*Adi 2 floating-point type-conversion go

我想转换一个float64数字,让我们也说1.0031003(整型).我的实现只是将float64with 乘以1000并将其转换为int.

package main

import "fmt"


func main() {
  var f float64 = 1.003
  fmt.Println(int(f * 1000))
}
Run Code Online (Sandbox Code Playgroud)

但是,当我运行该代码时,我得到的1002不是1003.因为Go会自动存储1.0031.002999...变量.在Golang上进行这种操作的正确方法是什么?

icz*_*cza 5

转到规格:转换:

数字类型之间的转换

将浮点数转换为整数时,将丢弃该分数(截断为零).

所以基本上当你将浮点数转换为整数时,只保留整数部分.

如果您只是想避免因使用有限位表示而产生的错误,只需0.5在转换之前添加数字即可int.无需外部库或函数调用(来自标准库).

由于float -> int转换不是舍入而是保留整数部分,因此这将为您提供所需的结果.考虑到可能的更小和更大的代表性:

1002.9999 + 0.5 = 1003.4999;     integer part: 1003
1003.0001 + 0.5 = 1003.5001;     integer part: 1003
Run Code Online (Sandbox Code Playgroud)

所以简单地写一下:

var f float64 = 1.003
fmt.Println(int(f * 1000 + 0.5))
Run Code Online (Sandbox Code Playgroud)

将它包装成一个函数:

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

// Using it:
fmt.Println(toint(f * 1000))
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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

  • 减去0.5而不是添加它
  • 或者从结果中添加0.5但减去1

将此结合到我们的辅助函数中:

func toint(f float64) int {
    if f < 0 {
        return int(f - 0.5)
    }
    return int(f + 0.5)
}
Run Code Online (Sandbox Code Playgroud)