Странное литье

У меня есть строка «65,57».
Мне нужно получить INT 6557

Тем не мение…

(int) (((float) "65.57") * 100) === 6556

Странно, когда разбито все работает как положено

((float) "65.57") * 100) === 6557.0

а также

(int) 6557.0 === 6557

но когда встраивается, я получаю 6556.

0

Решение

Не связывайтесь с поплавками, они только причинят вам боль. 🙂

Я бы просто снял точку:

$s = '65.57';
$x = str_replace('.', '', $s);

Если вам действительно нужен int, тогда приведите результат:

$x = (int) str_replace('.', '', $s);
1

Другие решения

Как сказал Алекс

Не связывайтесь с поплавками, они только причинят вам боль. 🙂

function parsePrice($str) {
$parts = explode('.', $str);
return intval($parts[0]) * 100 + intval($parts[1]);
}

var_dump(parsePrice('65.57'));

// Output: int(6557)
0

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

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

Настоящая причина кроется в двоичном коде, мы привыкли к 10-базовой системе счисления. Точно так же, как мы не можем точно описать 1/3 (~ 0.3333333333 ..) двоичный файл, не всегда можно описать наши «совершенно мелкие десятичные числа» в 10-значном числе, вы можете настроить точность, которую использует PHP для вычисления чисел с плавающей точкой в ​​вашем php.ini. , Но вам было бы гораздо лучше избегать поплавков и делать вычисления, используя целые числа.

Больше по теме:

Примеры неточностей с плавающей точкой

Могу ли я положиться на обходной путь PHP php.ini для решения проблем с плавающей запятой

0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector