【发布时间】:2018-03-11 13:03:54
【问题描述】:
我的问题看起来很简单,但我还没有解决它.. 用户输入金额 xx.xx 作为字符串。之后,我将字符串转换为浮点值(一些美元,一些美分),例如,让它成为 655.18 (float64) 然后,我需要将此金额转换为美分 - 655.18*100,结果为 65517.9999999,因此当我将此值转换为 int 时,我得到 65517,因此损失了 1 美分。 如何避免这种行为?
代码:
package main
import (
"fmt"
"strconv"
)
func CheckParamsPur(sa string) (amount float64) {
amount, _ = strconv.ParseFloat(sa, 64)
return amount
}
func main() {
fmt.Print("Enter a number: ")
var input string
fmt.Scanf("%s", &input)
amount := int(CheckParamsPur(input) * (100))
fmt.Println(amount)
}
【问题讨论】:
-
你不能。这就是花车的工作原理。浮点数不是实数,只是 不能 表示一些十进制数。您要么必须非常小心并实施适当的舍入,要么一直使用美分,要么使用小数类型。这很快就会变得丑陋。祝你好运。
-
如果您想了解为什么某些值无法表示,这篇文章解释了浮点数如何很好地工作:fabiensanglard.net/floating_point_visually_explained
-
以及该博文的相应反向渠道news.ycombinator.com/item?id=15359574
标签: variables go type-conversion rounding