Обожаю РНР
$val = "4.1";
$newVal = $newVal * 100;
$result = intval($newVal);
как вы думаете, чему будет равен $result?
409
Я всегда знал, что 4.1*100 будет равно 409
В общем, мне нужно решение для следующего сценария:
— цены вводятся в десятичных дробях (2.2, 4.1, 123.45 и т.п.)
— цены хранятся в целых (то бишь центах, 220, 410, 12345 и т.п)
Возникает проблема перевода вводимых цен в целые числа. Единственное, что придумали в свете вышеописаного — делать split по точке, проверять обе части, дополнять центы нулями по необходимости, а потом соединять вместе
Может, есть решение лучше?
PHP. float -> int
Floating point precision
It is quite usual that simple decimal fractions like 0.1 or 0.7 cannot be converted into their internal binary counterparts without a little loss of precision. This can lead to confusing results: for example, floor((0.1+0.7)*10) will usually return 7 instead of the expected 8 as the result of the internal representation really being something like 7.9999999999....
This is related to the fact that it is impossible to exactly express some fractions in decimal notation with a finite number of digits. For instance, 1/3 in decimal form becomes 0.3333333. . ..
So never trust floating number results to the last digit and never compare floating point numbers for equality. If you really need higher precision, you should use the arbitrary precision math functions or gmp functions instead.
Прежде чем чего то ругать утрудите себя прочтением документациии, и самое главное поймите её
Posted via RSDN NNTP Server 2.1 beta
m> Прежде чем чего то ругать утрудите себя прочтением документациии, и самое главное поймите её
Меня волнует не это, а как с этим бороться
ЗЫ. Под рукой есть PHP, Python, Ruby и Erlang. Во всех такая же проблема
Python:
>>> float("4.1")*100
409.99999999999994
>>> int(float("4.1")*100)
409
>>> 1.11 * 100
111.00000000000001
Erlang:
1> {F, _} = string:to_float("4.1").
{4.1,[]}
2> F.
4.1
3> F * 100.
409.99999999999994
4> 1.11*100.
111.00000000000001
Ruby:
>> a = "4.1".to_f
=> 4.1
>> Integer(a*100)
=> 409
>> 1.11 * 100
=> 111.0
Здравствуйте, Mamut, Вы писали:
M>Меня волнует не это, а как с этим бороться
Видимо, например так:
$val = "4.1";
$newVal = $val * 100;
$result = intval(round($newVal, 0));
MC> $val = "4.1";
MC> $newVal = $val * 100;
MC> $result = intval(round($newVal, 0));
Да, че-то я про round забыл. Правда, где-то у нас как-то round тоже глючил, не помню, правда, в каких условиях
Форум сам собой переключился в древовидную структуру, из за чего не увидел, что уже давно ответили.