2014-11-22 34 views
-6

比方說,我有一個輸入1.251564我怎樣才能找到雙數的數量?

我怎麼能找到多少元素"."後有一個輸出如下:

int numFloating; 

// code to go here that leads to 
// numFloating == 6 

附:對不起,不提供任何代碼,我只是不知道應該怎樣實現:(你的答案

謝謝!

+3

點數在1/3後有多少個元素?在數學上來說,在小數點後面,有一個無限的3點。我不確定這個數字如果乘以10(例如)會如何反應,顯然,您不能存儲數字無窮大。這不是一個簡單的問題,因爲浮點值的表示和操作不允許這樣做。 – 2014-11-22 11:00:32

+0

讓我們考慮我們有雙重類型 - 這意味着我們有最多16個點後的元素。 – SuTron 2014-11-22 11:02:03

+0

我恢復了編輯。當你有一個新的問題要問,你需要問這個問題,一個新的問題。 – 2014-11-22 11:20:55

回答

1

這不會結束。問題是,有時在用二進制表示數字時存在浮點錯誤(這是您的計算機所做的)。 例如,當添加1/3 + 1/3 + 1/3時,您可能會得到0.999999 ...並且小數位數變化很大。

拉維已提供給計算它的好方法,所以我將提供一個不同:

double number = 0; // should be equal to the number you want to check 
int numFloating = 0; 
while ((double)(int)number != number){ 
    number *= 10; 
    numFloating++; 
} 

號碼是保存要檢查小數位數雙變量。

+0

謝謝,請你澄清一下「數字」是什麼?輸入? – SuTron 2014-11-22 11:08:16

+0

'double number = 1.251564',this code results in'numFloating == 0' – 2014-11-22 11:39:37

+1

這甚至在原則上也不起作用,因爲乘以10並不確切。 – 2014-11-22 11:41:04

2

簡單的方法是將其存儲到字符串。

std::string str("1.1234"); 
size_t length = str.length(); 
size_t found = str.find('.', 0); 
size_t count = length-found-1; 
int finallyGotTheCount = static_cast<int>(count); 
+0

感謝您的回答。然後如果我想把這個數字作爲一個整數,我該如何轉換它? – SuTron 2014-11-22 11:03:13

+0

請檢查更新回答 – ravi 2014-11-22 11:05:59

+0

謝謝,這很好地解釋了答案。不幸的是,我想避免使用std標準,如:string:因爲我在跨平臺上工作,但非常感謝! – SuTron 2014-11-22 11:10:15

0

如果你有一個小數比方說0.1234

反覆乘以10,扔掉數量的整數部分,直到你得到零的步數將小數位數例如:。

.1234 * 10 = 1.234 
.234 * 10 = 2.34 
.34 * 10 = 3.4 
.4 * 10 = 4.0 

但是,如果您有一個像「1.199999999」一樣的「浮動」數字,就會出現問題。

0
int numFloating = 0; 

double orgin = 1.251564; 

double value = orgin - floor(orgin); 

while(value == 0) 
{ 
    value *= 10; 
    value = value - floor(value); 
    numFloating ++; 
} 

通過使用此代碼有時候答案是錯誤的。 exp:浮點數爲零等於(2^31)-1。 顯然輸出取決於它如何真正存儲。

+0

謝謝,應該適合我,因爲我不需要轉換它:) – SuTron 2014-11-22 11:05:56

5

讓我們考慮你的號碼,1.251564。當您將其存儲在double中時,它將以二進制IEEE754格式存儲。你可能會發現這個數字是不可表示的。所以,讓我們檢查這個數字。 closest representable雙是:

1.25156 39999 99999 89880 45035 73046 53152 82344 81811 52343 75 

這可能是作爲一個驚喜給你。小數點後面有52位十進制數字。

您需要從中獲得的教訓是,如果您想提出有關小數表示的問題,則需要使用十進制數據類型而不是double。一旦你能夠準確地代表價值,那麼你將能夠以符合你的期望的方式推理它。

+0

謝謝,很高興知道。我想解決的問題是看素數分數形式的雙數是否有奇數分母。 – SuTron 2014-11-22 11:13:20

+0

這是一個不錯的鏈接。我愛0.1如何不是真的0.1 :) – fredoverflow 2014-11-22 11:13:30

+0

@MikaelEgibyan然後,你爲什麼不問「如何確定素數分數形式的雙數有奇數分母」? – fredoverflow 2014-11-22 11:14:17