Forum Webscript.Ru

Программирование => PHP => Тема начата: KPG от 28 Ноября 2005, 21:43:08

Название: 34.73 - 34.73 = 7.17721265656 E9
Отправлено: KPG от 28 Ноября 2005, 21:43:08
Вот такая ерунда получается...
Грубо говоря есть следующее:

В базе данных есть две таблицы.
В одной таблице приход, в другой расход.
поле обозначающее приход/расход = decimal(7,2)

В таблице расход есть две суммы 5.00 и 29.73
В таблице приход одна сумма 34.73

По идее в итоге баланс должен быть 0.
Но у меня получается так, как в заголовке темы.

Причем:
1. Скрипт, который суммирует суммы в таблицах выдает для обоих таблиц суммы=34.73
2. Этот же скрипт при вычитании одной суммы из другой не выдает результат=0
3. Если в таблице расхода удалить эти две суммы и вписать всё одной суммой (34.73), то скрипт выдает разницу=0

В итоге:
1. Суммирование по таблице происходит правильно (выводятся обе суммы)
2. Скрипт считающий разницу между суммами в таблицах считает правильно
3. Всё это вместе не работает...
Название: 34.73 - 34.73 = 7.17721265656 E9
Отправлено: Меняздесьдавнонет от 28 Ноября 2005, 22:07:49
читай ман
про арифметику
Название: 34.73 - 34.73 = 7.17721265656 E9
Отправлено: KPG от 28 Ноября 2005, 22:18:40
Спасибо! Очень остроумный ответ.
Если на всех форумах будут посылать на ман, то зачем тогда и форумы?

Проблему конечно решил: round(summa, 2)

Но вопрос остался:
Почему если в обоих таблицах одинаковые числа (34.73) (т.е. суммировать там нЕчего), то разница между ними считается правильно ( 34.73 - 34.73=0 ).
Но стОит только в одной из таблиц разбить это число на 5 и 29.73, то суммы в обоих таблицах совпадают (присваиваются переменным), а разница между ними уже не равна 0
(34.73 - (29.73+5) = -7.17721265656 E9) ?
Название: 34.73 - 34.73 = 7.17721265656 E9
Отправлено: Меняздесьдавнонет от 29 Ноября 2005, 01:32:53
Цитировать
KPG:
Если на всех форумах будут посылать на ман, то зачем тогда и форумы?

ты совершенно прав. форумы не нужны. нужен ман.

Цитировать
KPG:
Но вопрос остался:

ну если у тебя вопрос остался - почему ты демонстративно отказываешься его решать?  
Почему ты считаешь, что какой-нибудьб прохожий с форума расскажет тебе лучше, чем официальная документация?
Название: 34.73 - 34.73 = 7.17721265656 E9
Отправлено: KPG от 29 Ноября 2005, 08:29:18
Не всегда есть возможность (или время или желание) изучать документацию...

А более конкретного ответа я и не ожидал от тебя услышать. Посмотрел по форуму - так у тебя одни ответы "читай ман" или "не так всё надо делать". Это очень содержательные и полезные ответы. Форум то вроде по PHP и создан насколько я понимаю как раз для обсуждения этого языка а не для отправления на ман...

Проблему конечно решу и ман поизучал(ю), просто на форумах общаются не только такие знатоки ссылок на маны (кстати, хоть бы тогда ссылочку давал - где ман поизучать) как ты, но и люди, готовые поделиться своим опытом и мыслями. Так что иди изучай ман дальше и посылай всех туда же...
Название: 34.73 - 34.73 = 7.17721265656 E9
Отправлено: Меняздесьдавнонет от 29 Ноября 2005, 17:06:39
а я и делюсь своим опытом. ты разве не заметил? =)
Название: 34.73 - 34.73 = 7.17721265656 E9
Отправлено: 0b0rm0t от 30 Ноября 2005, 10:23:22
Цитировать
KPG:
Форум то вроде по PHP и создан насколько я понимаю как раз для обсуждения этого языка а не для отправления на ман...


Имхо неправильно понимаешь. И вопрос твой имеет такое же отношение к php как и к любому другому языку.

По поводу проблемы: все правильно, так и должно быть. Решается округлением, что и было сделано.

Почему? Гугли на тему типов данных, числа с плавающей точкой.
Название: 34.73 - 34.73 = 7.17721265656 E9
Отправлено: KPG от 30 Ноября 2005, 11:53:32
0b0rm0t
В данном контексте вопрос был привязан именно к PHP, но не сомневаюсь, что и к любому другому языку он может иметь такое же отношение...

По карйней мере, твой ответ был гораздо конкретнее и имел реальный смысл. За что и спасибо!

И посылание в гугл в твоем ответе имеет конкретный совет "числа с плавающей точкой", а не так "читай ман".
Вот это я имел в виду, когда отвечал на предыдущие сообщения.