PHP с длинным десятичным числом - PullRequest
1 голос
/ 03 июня 2011

Я анализирую xml, используя php, и одна из моих переменных получает длинное десятичное значение.

$ctr = 0.00529440333938;

Но мне нужно сделать это число равным 0,52%, поэтому я попытался умножить на 100 и заставить только 2 десятичных знака.

$real_ctr = $ctr * 100;
echo number_format($real_ctr, 2) . "%";

В результате я получаю 0,00% вместо 0f 0,52%

И затем я попытался добавить 1 только для целей тестирования

$real_ctr = $ctr + 1;

, и я получил в результате+0,005294403339381.Это добавляет 1 в конце.

Какие-нибудь предложения, как я могу обойти эту проблему?

Ответы [ 4 ]

4 голосов
/ 03 июня 2011

это работает для меня:

$ctr = 0.00529440333938; 

$real_ctr = (double)$ctr * 100; 
$real_ctr = number_format($real_ctr, 2, ".", "") . "%";
$real_ctr = $ctr + 1;

и используйте number_format ($ real_ctr, 2, ".", ""), Если вы не живете в Великобритании.

2 голосов
/ 03 июня 2011

Это выглядит как $ctr то, что вы получаете от анализатора XML, это строка.Используйте:

$ctr = floatval($ctr); // or (double)$ctr; or (float)$ctr;

, чтобы убедиться, что ваша переменная является плавающей точкой.

1 голос
/ 03 июня 2011

Природа переменных с плавающей точкой и двойного типа заключается в том, что на них нельзя полагаться для точности последней цифры. Ознакомьтесь с руководством: http://php.net/manual/en/language.types.float.php

Важно понимать числа с плавающей точкой, прежде чем использовать их - если вы делаете какие-либо финансовые расчеты, то эти числа будут давать вам неожиданные результаты из-за присущей им неточности. Вам лучше придерживаться удвоения, если вам нужны точные результаты, особенно , если вы работаете с чем-либо, связанным с деньгами.

Итак, убедитесь, что вы используете ожидаемый тип номера. Вы сталкиваетесь с проблемой, когда ваш номер превращается в число с плавающей запятой / двойной из-за свободной типизации PHP. Посмотрите документы по жонглированию: http://www.php.net/manual/en/language.types.type-juggling.php, там может быть некоторая полезная информация.

По сути, вам нужно будет убедиться, что ваши числа остаются в ваших вычислениях целыми числами, вы должны помешать PHP "решить" тип за вас. Посмотрите на intval или математические функции BC BC, если вам нужно углубиться в это: http://www.php.net/manual/en/ref.bc.php

0 голосов
/ 03 июня 2011

Это читается как строка.Вы буквально устанавливаете его равным 0,00529440333938, или вы устанавливаете его равным тому, что, по вашему мнению, равно 0,00529440333938?Попробуйте это после оператора присваивания и посмотрите, работает ли он:

$ctr = floatval($ctr);
...