У меня есть строка «65,57».
Мне нужно получить INT 6557
Тем не мение…
(int) (((float) "65.57") * 100) === 6556
Странно, когда разбито все работает как положено
((float) "65.57") * 100) === 6557.0
а также
(int) 6557.0 === 6557
но когда встраивается, я получаю 6556.
Не связывайтесь с поплавками, они только причинят вам боль. 🙂
Я бы просто снял точку:
$s = '65.57';
$x = str_replace('.', '', $s);
Если вам действительно нужен int, тогда приведите результат:
$x = (int) str_replace('.', '', $s);
Как сказал Алекс
Не связывайтесь с поплавками, они только причинят вам боль. 🙂
function parsePrice($str) {
$parts = explode('.', $str);
return intval($parts[0]) * 100 + intval($parts[1]);
}
var_dump(parsePrice('65.57'));
// Output: int(6557)
Вы наткнулись на проблему неточности с плавающей запятой.
Проблема в том, что с плавающей запятой всегда есть количество десятичных знаков, а иногда и количество десятичных знаков, скрытых от вас, из-за этого вы будете время от времени сталкиваться с тем, что они не всегда умножаются вместе, как вы ожидаете.
Настоящая причина кроется в двоичном коде, мы привыкли к 10-базовой системе счисления. Точно так же, как мы не можем точно описать 1/3 (~ 0.3333333333 ..) двоичный файл, не всегда можно описать наши «совершенно мелкие десятичные числа» в 10-значном числе, вы можете настроить точность, которую использует PHP для вычисления чисел с плавающей точкой в вашем php.ini. , Но вам было бы гораздо лучше избегать поплавков и делать вычисления, используя целые числа.
Больше по теме:
Примеры неточностей с плавающей точкой
Могу ли я положиться на обходной путь PHP php.ini для решения проблем с плавающей запятой