我是Golang的新手。我想把一个浮点数分成整数和小数部分。经过一些研究,我实现了它,但我的代码有一个问题。我使用5.8作为输入,但结果是5和0.79999。
package main
import(
"fmt"
"math"
)
func Round2(val float64) {
intpart, div := math.Modf(val)
fmt.Println(div)
fmt.Println(intpart)
}
func main() {
fmt.Println("Hello, playground")
Round2(5.8)
}
我试过了,我得到的输出是:
0.7999999999999998
5
如果有任何其他的方法来做到这一点,请让我知道。我已经插入了我的代码去操场在它。
https://play.golang.org/p/O4n0k0XyMX
4条答案
按热度按时间z9ju0rcb1#
这是浮点运算的产物。浮点值并不总是你所期望的值,因为不是所有的数字都能用你所使用的浮点格式来表示。显然,这个值非常接近0.8,等于15位有效数字。注意,这并不是Go语言特有的。
代替
尝试
看起来这篇文章有一些很好的信息:https://en.wikipedia.org/wiki/Floating_point#Accuracy_problems
dohp0rv52#
试试这个:
完整的答案在go playground中,基本上我使用了格式说明符
%g
来获得结果,此外,%.6g
将小数部分四舍五入到六位,尾部零没有显示。Documentation of fmt package
tv6aics13#
您可能希望使用精度固定为.00的
Decimal64p2
类型的小数-https://github.com/strongo/decimal它能有效地存储准确的钱数。
brvekthn4#
在我的例子中,我需要***精确的***小数位数,而
Modf
需要改变一些数字,所以我创建了一个如下的效用函数:在主函数中这样使用它:
输出结果为: