PHP. float -> int
От: Mamut Швеция http://dmitriid.com
Дата: 03.04.09 06:21
Оценка:
Обожаю РНР


$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 по точке, проверять обе части, дополнять центы нулями по необходимости, а потом соединять вместе

Может, есть решение лучше?
avalon 1.0b rev 146


dmitriid.comGitHubLinkedIn
Re: PHP. float -> int
От: meandr  
Дата: 03.04.09 07:24
Оценка: 36 (1)
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
Re[2]: PHP. float -> int
От: Mamut Швеция http://dmitriid.com
Дата: 03.04.09 10:23
Оценка:
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
avalon 1.0b rev 146


dmitriid.comGitHubLinkedIn
Re[3]: PHP. float -> int
От: MozgC США http://nightcoder.livejournal.com
Дата: 03.04.09 11:03
Оценка: 36 (1)
Здравствуйте, Mamut, Вы писали:

M>Меня волнует не это, а как с этим бороться


Видимо, например так:

$val = "4.1";
$newVal = $val * 100;
$result = intval(round($newVal, 0));
Re[4]: PHP. float -> int
От: Mamut Швеция http://dmitriid.com
Дата: 03.04.09 11:09
Оценка:
MC>
$val = "4.1";
MC> $newVal = $val * 100;
MC> $result = intval(round($newVal, 0));


Да, че-то я про round забыл. Правда, где-то у нас как-то round тоже глючил, не помню, правда, в каких условиях
avalon 1.0b rev 146


dmitriid.comGitHubLinkedIn
Re: PHP. float -> int
От: EugeneIvanov Земля http://e-ivanov.ru/portfolio/
Дата: 03.04.09 11:33
Оценка: :)
Здравствуйте, Mamut, Вы писали:

читайте документацию $result = round($newVal, 0);
$result = intval($result);
Re: PHP. float -> int
От: Панда Россия  
Дата: 06.04.09 12:20
Оценка: 36 (1)
Использовать round, а не intval.
Re[2]: PHP. float -> int
От: Панда Россия  
Дата: 06.04.09 12:22
Оценка:
Форум сам собой переключился в древовидную структуру, из за чего не увидел, что уже давно ответили.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.