Re[3]: Округление double
От: __kot2  
Дата: 10.06.15 15:45
Оценка:
Здравствуйте, Кодт, Вы писали:
К>Здравствуйте, __kot2, Вы писали:
__>>когда разговор заходит про ньюансы округления, то это обычно финансы. деньги. специально для этого есть тип decimal, просто забудьть про double и все.
К>Можно просто считать в копейках.
вы просто отодвинете проблему на большие суммы, всего на два порядка.
Re[4]: Округление double
От: Кодт Россия  
Дата: 10.06.15 16:20
Оценка: +1
Здравствуйте, __kot2, Вы писали:

К>>Можно просто считать в копейках.

__>вы просто отодвинете проблему на большие суммы, всего на два порядка.

А fixed point, наоборот, сразу придвинет проблему. Придётся во всех расчётах (в том числе, промежуточных) куда-то списывать дробные копейки.
Перекуём баги на фичи!
Re: Округление double
От: Caracrist https://1pwd.org/
Дата: 10.06.15 18:01
Оценка:
Здравствуйте, SL, Вы писали:

SL>здравствуйте такой вопрос мне нужно округлить тип double до двух знаков, вот моя реализация


как на счёт пользоваться fraction?

например:
http://codepad.org/OzHKJe5A
там int_t можно поменять на bignum
~~~~~
~lol~~
~~~ Single Password Solution
Re[6]: Округление double
От: pagid Россия  
Дата: 14.06.15 20:02
Оценка:
Здравствуйте, _DAle_, Вы писали:

_DA>Иногда можно и обычным long обойтись.


С long есть маленькая проблемка

123*100/118 != 123/118*100

С decimal с необходимым числом знаков после точки всё проще, но и там следует осознавать когда нужно округлять и какие эффекты могут проявиться. Точно так же как и с double.
... << RSDN@Home 1.2.0 alpha 5 rev. 1495>>
Re[5]: Округление double
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 14.06.15 20:27
Оценка:
Здравствуйте, SL, Вы писали:

SL>В целом да с финансами, насчет Fixed point floating это понятно, но интересно Excel тоже использует Fixed point floating арифметику, потому что если в нем в трех ячейках вбить цифры 2625, 0.18, 100 и в четвертой указать операцию с тремя ячейками то есть (2625.0 * 0.18)/100 и указать в формате два знака после запятой, то Excel выводит 4.73.


Скорее всего.
В double ты никогда точно не округлишь — т.е. конечно могут быть числа, которые точно представимы в формате double, но это только в отдельных частных случаях.
double принято округлять при выводе пользователю (кстати, возможно, что Excel и так поступает)
Маньяк Робокряк колесит по городу
Re[7]: Округление double
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 14.06.15 20:31
Оценка:
Здравствуйте, pagid, Вы писали:

_DA>>Иногда можно и обычным long обойтись.


P>С long есть маленькая проблемка


P>123*100/118 != 123/118*100


Нет проблемы, просто часть бит нужно отвести под дробную часть с нужной чточностью, и не забывать нормализовывать.

с double кстати, такая же фигня скорее всего

P>С decimal с необходимым числом знаков после точки всё проще, но и там следует осознавать когда нужно округлять и какие эффекты могут проявиться. Точно так же как и с double.


Да вообще всегда нужно понимать, что делаешь
Маньяк Робокряк колесит по городу
Re[8]: Округление double
От: pagid Россия  
Дата: 15.06.15 02:50
Оценка:
Здравствуйте, Marty, Вы писали:

M>Нет проблемы, просто часть бит нужно отвести под дробную часть с нужной чточностью, и не забывать нормализовывать.

Тогда мы вернемся по кругу в начало разговора и к вопросу ТС

M>с double кстати, такая же фигня скорее всего

+1

M>Да вообще всегда нужно понимать, что делаешь

+1
... << RSDN@Home 1.2.0 alpha 5 rev. 1495>>
Re: Округление double
От: pagid Россия  
Дата: 15.06.15 02:50
Оценка:
Здравствуйте, SL, Вы писали:

SL>округляется до 4.72 и вроде понятна причина число 4.725 на самом деле представляет собой 4.729999999999999, но не могу понять как побороть.

Скорее всего "бороть" и не нужно. Округлятся должно при выводе на экран/печать и библиотечные функции поступают именно так. Если программа работает с БД, и речь идет про деньги, то можно убедится, что при сохранении в субдешную DECIMAL происходит именно округление, но вроде по стандарту SQL это так.

Использование чего-то подобного decimal из С# тоже вариант, но полезность этого стоит оценить, пока из того, что ты написал необходимость так извращаться не очевидна.
... << RSDN@Home 1.2.0 alpha 5 rev. 1495>>
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.