Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > .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 секунды
Чё-то у меня по всякому получается без глюков:

Код

static void Main(string[] args)
        {
            Console.WriteLine(Math.Round((double)141729.10560000001,2));
            Console.WriteLine(Math.Round(141729.10560000001m,2));
            Console.ReadLine();
        }


выдаёт

141729,11
141729,11

Добавлено через 11 минут и 25 секунд
Не могу воспроизвести ошибку. Ни так, ни сяк.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)