Как лучше всего определить, имеет ли значение с плавающей точкой нулевую дробь (например, 125,00) в PHP? - PullRequest
4 голосов
/ 24 ноября 2010

См., Я хочу написать функцию, которая принимает параметр числа с плавающей точкой и округляет число с плавающей точкой до ближайшего значения валюты (число с плавающей запятой с двумя десятичными знаками), но если параметр с плавающей запятой имеет нулевую дробь (то есть все нули за десятичное место), затем он возвращает число с плавающей точкой как целое число (или, т. е. усекает десятичную часть, так как они все равно равны нулю).

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

Ответы [ 6 ]

12 голосов
/ 24 ноября 2010
if($value == round($value))
{
    //no decimal, go ahead and truncate.
}

В этом примере сравнивается значение с самим собой, округленное до 0 десятичных знаков.Если округленное значение совпадает со значением, у вас нет десятичной дроби.Просто и понятно.

10 голосов
/ 24 ноября 2010

Небольшой трюк с возможностями жонглирования типа PHPs

if ($a == (int) $a) {
    // $a has a zero fraction value
}
1 голос
/ 12 мая 2018

Я думаю, что лучший способ:

if ((string)$value == (int)$value){
    ...
}

Пример:

$value = 2.22 * 100;
var_dump($value == (int)$value); // false - WRONG!
var_dump($value == round($value)); // false - WRONG!
var_dump((string)$value == (int)$value); // true - OK!
1 голос
/ 24 ноября 2010
function whatyouneed($number) {
    $decimals = 2;
    printf("%.".($number == (int)($number) ? '0' : $decimals)."F", $number);
}

Так что в основном это либо printf("%.2F"), если вы хотите 2 десятичных знака, и printf("%.2F"), если вы не хотите ни одного.

0 голосов
/ 24 ноября 2010

Точно так же, как вы знаете, вам не нужно писать функцию , чтобы сделать это, она уже существует:

$roundedFloat = (float)number_format("1234.1264", 2, ".", ""); // 1234.13

Если вы хотите сохранить трейлинг .00, просто опустите бросок с плавающей точкой (хотя он вернет строку):

$roundedFloatStr = number_format("1234.000", 2, ".", ""); // 1234.00
0 голосов
/ 24 ноября 2010

Ну, проблема в том, что поплавки не точны. Читайте здесь , если вам интересно узнать почему. Что бы я сделал, это определился с уровнем точности, например, 3 знака после запятой, и основал точность на этом. Чтобы сделать это, вы умножаете его на 1000, приводите к int, а затем проверяете, является ли $ your_number% 1000 == 0.

$mynumber = round($mynumber *1000);
if ($mynumber % 1000==0)
{ isInt() }
...