使用golang

时间:2016-10-20 00:47:18

标签: go

我是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

如果还有其他办法,请告诉我。 我插入了带有代码的go操场。

https://play.golang.org/p/O4n0k0XyMX

3 个答案:

答案 0 :(得分:4)

这是浮点运算的工件。浮点值并不总是与您期望的值完全相同,因为并非所有数字都可以使用您正在使用的任何处理器使用的浮点格式精确表示。显然,该值非常接近0.8并且等于15个有效数字。请注意,这不是特定于Go。

而不是

fmt.Println(div)

fmt.Printf(".4f\n", div) // shows only 4 decimal places

看起来这篇文章有一些很好的信息:https://en.wikipedia.org/wiki/Floating_point#Accuracy_problems

答案 1 :(得分:0)

您可能希望使用固定.00精度的public class arrayTest { public static void main(String [] args) { int[]arrayA = {2,4,8,19,32,17,17,18,25,17}; int varB = 17; for(int B = 0; B < arrayA.length; B++) { if(arrayA[B] != varB) { System.out.print(arrayA[B] + " "); } } } public static int newSmallerArray( int[] A, int b ) { } } 十进制类型 - https://github.com/strongo/decimal

存储确切金额是有效的。

答案 2 :(得分:0)

尝试一下:

f := 5.8
ipart := int64(f)
fmt.Println(ipart)
decpart := fmt.Sprintf("%.7g", f-float64(ipart))[2:]
fmt.Println(decpart)

完整的答案在go playground中可用。基本上,我使用格式说明符%g来实现结果,此外,%.6g将小数部分四舍五入到第六位,尾随的零不显示。

Documentation of fmt package

相关问题