2011-03-01 143 views
0

我正在創建一個簡單的PHP程序,該程序在三個隨機數計算爲整數時執行一個操作(並且僅當)。隨機數都是整數,用rand()函數創建。沒有進入計算的具體細節,重要的事情(就我的問題而言)是它包括了取平方根。不是一個非常有經驗的PHP編碼器,我知道的唯一的平方根函數是sqrt()。問題是,sqrt()返回一個浮點數,即使輸入是一個整數並且輸出是確切的。我簡單地想過把輸出轉換爲一個整數(使用類似intval()的東西,但這不起作用,因爲它會將所有輸出轉換爲整數,使測試無用!關於如何做到這一點的任何想法? 謝謝,php sqrt函數返回一個整數?

+1

只要檢查'floor($ num)== $ num'?或者我錯過了什麼... – 2011-03-01 23:50:02

+2

你的問題有點不清楚。 – 2011-03-01 23:53:51

+1

@布拉德:原則上是好想法,但對於浮點數的== ==幾乎總是(讀:總是)一個壞主意。使用增量進行比較。見例如http://stackoverflow.com/questions/4682889/is-floating-point-ever-ok – sleske 2011-03-01 23:56:15

回答

4

如果你只是想以確定它是否是一個完美的正方形,只是確定

intval(result) * intval(result) == originalValue 

我不知道這些函數的PHP版本,但也許你做什麼? :)

+0

+1好主意。請注意,如果'original value'是一個浮點數(由於問題不清楚),這可能會失敗,因爲您無法將浮點數與'=='(使用任何語言)可靠地進行比較。 – sleske 2011-03-01 23:57:30

+0

是的,我喜歡這個。這將工作,因爲原始值是一個整數。謝謝! – Bill 2011-03-02 00:21:51

3

與浮點工作時是一個常見的問題只是檢查,你得到的浮動是非常接近的整數;通常,這是通過檢查小數部分非常小做到:

if (abs(round(f)-f))<delta) 
    # do stuff 

這裏的delta是一個很小的常量,比如0.0001,它必須小得多取決於你期望你的結果離一個整數有多近。這將取決於你的計算。

+0

這也是一個好主意(非常「Calculusesque」!)。知道一個好方法。我必須考慮多少精度是必要的... – Bill 2011-03-02 00:23:17

+0

@ Bill:謝謝。實際上,它比微積分更多的是數值分析。是的,搞清楚精度是棘手的部分......這就是人們做數值分析有時會花費數年的時間...... – sleske 2011-03-02 00:29:14

0

沿着if($result % 1.0 == 0)行可能工作,但我沒有能力現在測試它。

+0

這似乎應該起作用,但我不確定Sleske指出的浮點問題。 – Bill 2011-03-02 00:24:14

+0

-1這不起作用。 PHP的'%'運算符只能用於整數。因此'$ result%1.0'將爲任何輸入返回0。你想要函數'fmod'(floatin點模數)。但即使如此,你也不應該用'=='來比較結果,因爲這對於fp數字來說幾乎是不安全的。見例如http://stackoverflow.com/questions/4682889/is-floating-point-ever-ok – sleske 2011-03-03 11:15:26

0

$result % 1e9將返回$ result的整數部分(對於否定結果,它將找到結果的細胞)。但它是一種黑客攻擊,所以你可能只是爲了好玩而使用它。

https://repl.it/Chqm/1

0

這方面的知識是從其他語言編程,但是你試過用1 例如乘以表達式,如果你需要得到像 A = 3.45 * 8的東西整數;

這樣做 a = 3.45 * 8 * 1;