2014-06-29 11 views
0

我完全困惑爲什麼PHP行爲的方式是低於。PHP的價格,以INT是失去了一分

上下文:我正在使用第三方支付網關庫。出於某種原因,我的一些付款收取1c以下的費用!這對我們來說是一個巨大的問題。爲了使事情更奇怪,它似乎只是一些具體的金額

看着他們的代碼,我能夠在一個簡單的PHP腳本中重現這一點。

<?php 
$val = 568.3 * 100; 
echo $val; 
echo "\n"; 
echo (float) ($val); 
echo "\n"; 
echo (int) ($val); 
echo "\n"; 
echo intval($val); 
echo "\n"; 
?> 

預計產出將是56830所有回聲的,而是,當它的鑄造或使用INTVAL它打印出56829(1C以下),不使用類型轉換或浮動的作品。該修復似乎只是不使用int或intval轉換,但我很好奇爲什麼發生這種情況。

如果你放在56830那麼它都打印好。可重複使用568.31 * 100但不是568.32 * 100.

任何人都可以幫助我理解最新情況嗎?

編輯:float/floatval/no casting將返回預期值。

下面的工作,只是當使用568.3它損失1美分! $ val = 5.3 * 100; $ val = 56888.3 * 100;

+0

如何使用['floatval()'](http://ch1.php.net/manual/en/function.floatval.php)? – samayo

+0

http://stackoverflow.com/questions/3730019/why-not-use-double-or-float-to-represent-currency/ – zneak

+0

在這裏閱讀從PHP手冊http://in3.php.net/language。 types.float ...雖然轉換爲int,但您可以先將float結果轉換爲字符串,然後轉換爲int,如echo(int)(string)($ val); – rock321987

回答

0

FuzzyTree的答案解釋了浮點算法的問題。您可以在intval之前使用round來修復它。

<?php 
$val = 568.3 * 100; 
echo $val; 
echo "\n"; 
echo (float) ($val); 
echo "\n"; 
echo (int) (round($val)); 
echo "\n"; 
echo intval(round($val)); 
echo "\n"; 
?> 

輸出:

56830 
56830 
56830 
56830 
0

$ val是float類型的值,類似於56829.999999 ...,並且在轉換爲int時被舍入。

從手動

http://www.php.net/manual/en/language.types.integer.php

從浮點數¶

當從浮點數轉換爲整數時,數字將被舍入 朝向零。

如果浮點數超出了整數的範圍(在32位平臺上通常爲+/- 2.15e + 9 = 2^31且在64位平臺上爲+/- 9.22e + 18 = 2^63)比Windows),結果是未定義的,因爲float不是 具有足夠的精度來給出精確的整數結果。沒有警告,而不是 即使發生這種情況,也會發出通知!

+0

但是,如果我有「(int)56888.3 * 100」它按預期工作?它只是當我有「(int)568.3 * 100」它給56829.此外「5.3 * 100」給出5.3 ...? – user3786983

+0

當你'回聲'它四捨五入到最接近的整數,但是當你從'float'轉換爲int時,它往下舍入 – FuzzyTree

+0

感謝FuzzyTree,對java也是一樣,並且可以看到輸出通過.29.99999修復直截了當,先舍入/不做任何演員,但只是想知道。謝謝! – user3786983