2014-07-20 96 views
2

我想檢查一下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。

那麼計算小數位的適當方法是什麼?

回答

2

int值%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-

+0

是否有可能使這更加動態?這看起來像動態步驟的功能呢?用你的例子,我需要硬編碼'100'和'1e-5'。 – bodokaiser

+0

@bodokaiser查看更新,但當值接近9.99時會失敗,如9.990000001 – chendesheng

+0

謝謝。不介意我是否會將問題留給開放。否則我在後面標記:) – bodokaiser

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

//用一個小的優化更新

+0

這並不總是奏效:HTTP://play.golang。 org/p/_GVGeUs5cO – bodokaiser

+0

檢查更新,添加了一個「hacky」版本,與python/javascript中的更多功能相當。 – OneOfOne