| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > .NET для новичков > Math::round |
| Автор: hash_2000 28.10.2008, 08:03 |
| тут поднималась уже тема по поводу глюков в работе математических функций .Net ... только по моему решение не исчерпывающее. вот столкнулся с проблемой округления. вот округляю с помощью Math::Round до второго знака после запятой число 141729.10560000001 как результат возвращает мне 141729.10999999999 ... ??? я впал в некоторый ступор ... уже была мысль самому написать функции для округления, но всетаки может ктонибудь знает решение этой проблемы |
| Автор: Partizan 28.10.2008, 09:04 |
| hash_2000, никакие это не глюки...это нормальное представление числа с плавающей точкой... |
| Автор: Bogdan1024 28.10.2008, 11:24 |
| Мне кажется что товарищ hash_2000 округлил не до второго знака, а до первого. |
| Автор: Partizan 28.10.2008, 11:27 |
| Bogdan1024, да нет...вполне таки нормальное округление до второго... 141729.10560000001 Округляем до второго, получаем 141729.10999999999... ~ 141729.11 |
| Автор: Dims 3.11.2008, 12:55 | ||
| Наверное, чтобы работало правильно, надо использовать тип decimal. Я сам не пробовал, но по логике именно так и должно быть. Decimal означает "десятичный", в то время, как обычные double хранятся в двоичном представлении. А не любое дробное десятичное число может быть представлено конечной дробью в двоичной форме -- эти и приводит к таким результатам. Иными словами, надо округлять не 141729.10560000001 а 141729.10560000001m Буква "m" на конце означает десятичный тип. Сейчас проверю гипотезу... Добавлено через 7 минут и 2 секунды Чё-то у меня по всякому получается без глюков:
выдаёт 141729,11 141729,11 Добавлено через 11 минут и 25 секунд Не могу воспроизвести ошибку. Ни так, ни сяк. |