2014-09-25 2 views
3

Когда я попробую получить остаток, он дает недопустимое значение. Я пытаюсь получить осталось от двух десятичных значений, и я получаюPHP Floating Value Issue

3.4694469519536E-18

Мои Значения

$x=0.1; $y=0.005; 

Я попытался следующие:

echo $ed = fmod(0.1,0.005); OutPut:3.4694469519536E-18 
echo $ed = ((floatval(0.1)) % (floatval(0.005))); 

Но получение

Warning: Division by zero 

Но реальность - 0,1 будет делить на 0,005 в раз. то есть 0.1/0.005 = 20

Такая же функция возвращает правильное значение, когда я использую 10%1 = 0.

Как получить точный остаток. (Я не сталкиваюсь с теми же проблем в JQuery :))

Проверить Работу Around: PHP Division Float Value WorkAround

+4

3.47e-18 is zero-ish. У вас есть проблемы с плавающей точкой. –

+0

@NiettheDarkAbsol Я не могу получить ур точку? – TomPHP

ответ

3

Оператор % просто работает над целыми числами, поэтому он обрежет свои поплавки целых чисел и пытается сделать 0 % 0, который приводит к делению на ноль.

Единственное, что вы можете использовать, это fmod(). Проблема, с которой вы сталкиваетесь здесь, - это типичная неточность с плавающей запятой (значение «почти» равно нулю). Я хотел бы просто игнорировать значения меньшие, чем 10^-15. В PHP нет реальной альтернативы этому.

Что вы можете попробовать - это сделать реальное деление, то с небольшим ударом исчезнут следы неточности. (например, round(0.1/0.005) === 0.1/0.005)

+1

Так что в основном, а не 'x == 0', вы бы сделали' abs (x) <1e-15'. –

+1

@NiettheDarkAbsol yep, вы должны делать такие вещи при использовании поплавков. – bwoebi

+0

@bwoebi Что произойдет, если я умножу 100 на обеих сторонах и проверю оставшиеся? является хорошей практикой. т. е. ((0,1 * 100)% (0,005 * 100))? – TomPHP