【发布时间】:2019-09-27 04:36:53
【问题描述】:
当我将math.Floor 与浮点变量一起使用时遇到问题(向下舍入/截断精度部分)。我怎样才能正确地做到这一点?
package main
import (
"fmt"
"math"
)
func main() {
var st float64 = 1980
var salePrice1 = st * 0.1 / 1.1
fmt.Printf("%T:%v\n", salePrice1, salePrice1) // 179.9999
var salePrice2 = math.Floor(st * 0.1 / 1.1)
fmt.Printf("%T:%v\n", salePrice2, salePrice2) // 179
}
游乐场:https://play.golang.org/p/49TjJwwEdEJ
输出:
float64:179.99999999999997
float64:179
我希望1980 * 0.1 / 1.1 的输出为180,但实际输出为179。
【问题讨论】:
-
"Floor 返回 x 的最大整数值 小于或等于。" 即来自 floor 179.9 的结果 179 是 i> 正确 (play.golang.com/p/gPPLz-nQIzW)。如果您想要 180,请改用 round 或 ceil。
-
啊,这是由于基点数学和舍入错误造成的。没错,实际结果应该是 180,但是浮点运算中存在舍入错误,导致它是 179.999。除以 1.1 与乘以 0.90909090 相同......这导致了您的问题。你可以谷歌“golang修复浮点错误”之类的。我也想找点东西。
-
@shizend 你知道 floor 做什么并且你知道 floor 之前的值是 179.999 但你仍然将问题命名为“Golang 中的楼层号不正确”。无论如何,您都不应该将浮点数精确地用于货币值,因为它们不精确。
-
@shizend 使用 int64 作为以美分为单位的金额是一种常见的方法。
标签: go