2015-01-09 21 views
-1

我需要檢查一下我的雙數是否可以被餘數分爲0.05。所以我這樣做:檢查double是否可以不分餘數

if (!double.TryParse(ProductPriceTextBox.Text, out price) || !(0 < price) || !(price%0.05==0.0)) 

的問題是,我productSku,則可以在硬幣由出0.05,0.1,0.2,0.5,1,2歐元。

因此,所有的產品的價格必須是:price%0.05==0,那就是:

1歐元,1.5歐元,0.5歐元 - 通過 1.21歐元,0.01歐元 - 失敗。

但是編譯器提示我在:

(price%0.05==0.0) 

浮點數平等運營商的比較。 prescision

的可能的損失不能找出失敗的原因...

我當然可以這樣做:

int priceInCents= price*100; 
(priceInCents%5==0) 

但我認爲有一個其他的方式。

+2

浮點值往往不太準確。你會得到舍入錯誤。請閱讀* [每個計算機科學家應該知道的浮點運算](https://www.cl.cam.ac.uk/teaching/1011/FPComp/floatingmath.pdf)* – Richard

+4

這種計算(涉及'==')不應該使用double或float而是decimal! (或可能是一個epsilon條件) – TaW

+0

所以你說我應該使用美分來檢查這種 – Cheese

回答

5

您最好使用decimal數據類型,因爲它更適合貨幣。 (double是一種浮點數據類型,這對貨幣沒什麼好玩的,因爲它不精確)。

試試這個: decimal price;

if (!decimal.TryParse(ProductPriceTextBox.Text, out price) 
    || !(0 < price) 
    || !(price % 0.05M == 0) 
    ) 
+0

你不能把小數點除以0.05。編譯器錯誤 – Cheese

+0

@Cheese:檢查。 '.05'是一個浮點數,你需要'M'來讓編譯器知道它是一個'decimal',所以'.05M'工作。 –

-1

乘以你的價格與100和模量由5

!((price*100) % 5 == 0) 
+1

我在我的問題中已經解決了這個問題,但我想這也許有其他解決方案 – Cheese

+0

@TaW「......或者」。你是對的。所有使用'float'的計算都不可靠。 –

+0

對不起,沒有讀到最後。您應該使用小數點代替: decimal price = decimal.Parse(input); !(價格%(十進制).05 ==(十進制)0.0) –

1

全數字是這麼容易對付.....

if ((!double.TryParse(ProductPriceTextBox.Text, out price) 
    || (price * 20.0 != Math.Floor(price * 20.0))) 
    { // failure