如何计算浮点数的小数位?

时间:2014-07-20 16:03:33

标签: casting go floating-point-precision

我想检查一下float32是否有两个小数位。我的javascript方式如下:

step  := 0.01
value := 9.99

if int(value/step) % 1 == 0 {
    printf("has two decimal places!")
}

以上示例也有效。但是当步骤不正确时它将无效,因为无法从float64正确地转换为int。

示例:

step  := 0.1
value := 9.99

if int(value/step) % 1 == 0 {
    printf("has two decimal places!")
}

编译器错误:constant 9.99 truncated to integer

当我们使用动态值时,它将在每种情况下都返回true。

那么计算小数位数的合适方法是什么?

3 个答案:

答案 0 :(得分:2)

int value%1始终为零!

我建议另一种方式:

value := float32(9.99)
valuef := value*100
extra := valuef - float32(int(valuef))
if extra < 1e-5 {
    fmt.Println("has two decimal places!");
}

http://play.golang.org/p/LQQ8T6SIY2

<强>更新

package main

import (
    "math"
)

func main() {
    value := float32(9.9990001)

    println(checkDecimalPlaces(3, value))
}

func checkDecimalPlaces(i int, value float32) bool {
    valuef := value * float32(math.Pow(10.0, float64(i)))
    println(valuef)
    extra := valuef - float32(int(valuef))

    return extra == 0
}

http://play.golang.org/p/jXRhHsCYL-

答案 1 :(得分:1)

你必须欺骗它,添加一个额外的变量:

step := 0.1
value := 9.99
steps := value / step
if int(steps)%1 == 0 {
    fmt.Println("has two decimal places!")
}

或者在将其转换为int之前转换步骤,如:

int(float64(value / step))

playground

//修改

hacky非数学方法是将其转换为字符串并将其拆分,例如:

func NumDecPlaces(v float64) int {
    s := strconv.FormatFloat(v, 'f', -1, 64)
    i := strings.IndexByte(s, '.')
    if i > -1 {
        return len(s) - i - 1
    }
    return 0
}

playground

//使用次要优化进行更新

答案 2 :(得分:0)

这是一个获取浮点数小数部分的函数。可以使用len(decimalPortion(n))来获取小数位数。

func decimalPortion(n float64) string {
    decimalPlaces := fmt.Sprintf("%f", n-math.Floor(n)) // produces 0.xxxx0000
    decimalPlaces = strings.Replace(decimalPlaces, "0.", "", -1) // remove 0.
    decimalPlaces = strings.TrimRight(decimalPlaces, "0") // remove trailing 0s
    return decimalPlaces
}