Приведение типов

SiMM

Новичок
noLame, дело не в типах. В математике подобная проблема решается двумя способами - либо при помощи введения абсолютной погрешности вычислений (вариант попроще), либо при помощи введения относительной погрешности (вычислений поболе). Почитать о них можно, к примеру (если не ошибаюсь), в учебнике математики за 7й класс или здесь. Однако есть ещё один "шаманский" способ, основанный всё же на преобразовании типов ;)
PHP:
$a=111.01;
$b=61.01+50;
echo (string)$a - (string)$b;
Однако, правильнее, имхо, стремиться по возможности использовать числа с фиксированной запятой, тогда и вычисление выражения прямо в MySQL даёт положительный результат :)
 

noLame

Guest
Извиняюсь... все тки нужно было сразу полностью описать проблему!
MYSQL в данном случае вообще ни при чем.
Есть 2 переменные одна int другая float... при сложении выдает правильное число... но сама в переменных сесии прописывается не корректно(не знаю как назвать)
Пример:
$a = 3
$b = 0.1
$c = 3.10000000000000000888178419700125232338905334472
При том что выводит как надо без нулей на конце = 3.1
Если знаете решение - очень прошу.
Спасибо.
 

IL78

Guest
ИМХО то, что
выводит как надо без нулей на конце = 3.1
говорит как минимум о несущественности проблемы.

если нужны гарантии, можно подстраховать вывод чем-нибудь вроде [m]number_format[/m]
 

noLame

Guest
Нет... проблема очень существенна! Поверь мне:) Выводит в смысле на экран... в темпе сессии же как раз идет то большое число... и переменная равна именно этому числу:(
Проще было воспользоваться round(), но такая же фигня.. выводит правильно, сама переменная больше
Я понятно изъясняюсь?
 

IL78

Guest
Выводит в смысле на экран... в темпе сессии же как раз идет то большое число...
noLame, это напоминает старый анекдот: "- Это такси? - Да! - А где шашечки? - А вам шашечки нужны или ехать?"

Если в итоге работы скрипта выводится правильное значение, какое дело пользователю до промежуточного представления величин во время работы программы?
 

noLame

Guest
Ты знаешь чем помочь илм просто пофлудить?
После того как это значение показывается пользователю - идет выставление счета(WebMoney)... Формат переменной должен быть без нулей на конце и начале, далее та длинная переменная явно под формат денег не подходит... Так? Вот и получается что показав правильное значение, дальше отправляется запрос на сервер Маней.. с полем суммы 3.10000000000000000888178419700125232338905334472, хотя как я уже сказал должно быть 3.1
Можешь поддержать беседу дальше?
 

noLame

Guest
IL78
Да... это тебе не такси:) Блин замучился уже... здесь все прошустрил и на яндексе... даже не знаю куда звонить, кому писать :(
 

IL78

Guest
Очевидно, нужно округлить число до двух знаков после точки, а потом обработать его строковое представление.
что-то вроде такого:
PHP:
preg_replace('/(?<=\.[1-9])0|\.00/','',number_format($str, 2, '.', ''))
Наверняка можно оптимальнее, но это, кажется, работает...
 

SiMM

Новичок
noLame, да прочти ты чтоли ссылку, изучи хотя бы что-то по машинной (двоичной) арифметике - ведёшь себя як дитё, ей богу. Повторяю ещё раз - существует огромное множество конечных десятичных дробей, которые не могут быть переведены в конечную двоичную

-~{}~ 01.07.04 09:07:

В случае с одной десятой имеем 0.1 в десятичной = 0.0(0011) в двоичной - естесственно, что то будет отрезано и при обратном переводе потеряно - просто часто значения округляются при выводе - поэтому никто ничего и не замечает.
IL78, для округления разумнее использовать [m]round[/m]
 

IL78

Guest
SiMM, в данном случае это не математическое округление. round возвращает тип float, а тут нужно получить строку без лишних символов.
 

noLame

Guest
Автор оригинала: IL78
, в данном случае это не математическое округление. round возвращает тип float, а тут нужно получить строку без лишних символов.
Ладно дома попробую ещё раз... Вот вариант..

SiMM
Решение я там не увидел, а суть проблемы - если бы внимательно читал мой пост я и так понял.
 

mani13

Новичок
noLame:
1. Способ:
1. Умножаешь число, например, на 100
2. Отрезаешь всё после запятой
3. Делишь на 100
(int)
2 Способ:
1. Отрезаешь всё после запятой и засовываешь значение в какую-нибудь другую переменную
2. Смотришь длину
3. Делаешь round первой переменной, использую длину переменной+2...
(strlen, round, int)
Больше ничего на ум не приходит. Да и точность, по-моему, оставляет желать лучшего.
 

noLame

Guest
Спасибо, но я так и пытался... все одно... уже настолько все закручивал... единственное что осталось .. посимвольно разбирать как строку:(
 

IL78

Guest
fixxxer, как я понял из user contributed notes, bcadd просто отрезает цифры свыше заданного количества после точки. А тут все-таки деньги, ИМХО их все же нужно округлить по правилам и представить как строку - по-моему, number_format существует специально для таких случаев.

noLame, а что, мой пример с регуляркой у тебя не заработал?
 

noLame

Guest
IL78
Мил человек, есть кошелек Webmoney? Давай свой кошелек. Можешь на мыло [email protected]... Оплачу 1 WMZ за твою неоцинимую помощь... больше пока не могу.
Ты не поверишь как я намучался... а ты прям коротко и ясно коротко и ясно.
 
Сверху