Re[3]: Научите меня преобразованию типов
От: Аноним  
Дата: 12.03.09 18:09
Оценка: :)))
Здравствуйте, Пельмешко, Вы писали:

П>Здравствуйте, Пельмешко, Вы писали:


П>Раз вы приводите число к типу, не гарантирующему необходимую Вам точность, к тому же тип вообще не может представить нужное Вами число, то какие могут быть вопросы?

П>Если где то отображаете число, то при приведении к строке с форматом "G" (оно по умолчанию) вы получите строку "15.2"

по-моему, 12.5 — не настолько большая точность чтобы у float'а были проблемы с его хранением....
если точно ((decimal)12.5 => (float)12.5) нельзя преобразовать тип, я согласен на исключение, а если точности хватает, хочу получать именно _тоже самое_ число...
Re[4]: Научите меня преобразованию типов
От: abibok  
Дата: 12.03.09 18:33
Оценка: 3 (1)
А>по-моему, 12.5 — не настолько большая точность чтобы у float'а были проблемы с его хранением....

Дело не в точности числа (похоже вы понимаете его как количество десятичных знаков после запятой), а в количестве бит которое отводится на представление этого числа в памяти. Некоторые десятичные числа вообще невозможно записать точно в двоичной системе, требуется бесконечное количество бит. Посмотрите на двоичную запись 12.5 — сколько требуется бит для точной записи? Сравните с размером float.
Re[4]: Научите меня преобразованию типов
От: bukovka  
Дата: 13.03.09 02:32
Оценка: 1 (1)
А>по-моему, 12.5 — не настолько большая точность чтобы у float'а были проблемы с его хранением....
Вот кстати с 12.5 проблем быть не должно.

А>я согласен на исключение

У других есть серьезные возражения. Все-таки получать исключение после почти каждого умножения/деления -- это чересчур.
Автор, почитай про способ хранения чисел с плавающей запятой. Приходи просветленный с новыми вопросами.
Re: Научите меня преобразованию типов
От: Пельмешко Россия blog
Дата: 12.03.09 15:24
Оценка: +1
Здравствуйте, Аноним, Вы писали:

А>с .NET мало знаком, поэтому сильно не пинать...


А>проблема проста:


А>Decimal d = 15.2m;

А>Single s = Convert.ToSingle(d); // s = 15.1999998, а надо 15.2 =)

Топик надо было называть "научите меня floating-point", никакого отношения к .NET это не имеет.
Открою тайну — не все десятичные цифры можно точно представить в виде чисел с плавающей точкой без потерь.
Это абсолютно нормальное поведение. Изучите как устроены floating-point числа, а потом курить в сторону Math.Round()
Научите меня преобразованию типов
От: Аноним  
Дата: 12.03.09 15:14
Оценка:
с .NET мало знаком, поэтому сильно не пинать...

проблема проста:

Decimal d = 15.2m;
Single s = Convert.ToSingle(d); // s = 15.1999998, а надо 15.2 =)
Re[2]: Научите меня преобразованию типов
От: Пельмешко Россия blog
Дата: 12.03.09 15:39
Оценка:
Здравствуйте, Пельмешко, Вы писали:

П>Открою тайну — не все десятичные цифры можно точно представить в виде чисел с плавающей точкой без потерь.


Пардон, не цифры, а числа конечно же
И с Вашим числом и округление не поможет, чё та я ступил
Single ss = 15.2f; // это тоже 15.1999998


Раз вы приводите число к типу, не гарантирующему необходимую Вам точность, к тому же тип вообще не может представить нужное Вами число, то какие могут быть вопросы?
Если где то отображаете число, то при приведении к строке с форматом "G" (оно по умолчанию) вы получите строку "15.2"
Re[4]: Научите меня преобразованию типов
От: koandrew Канада http://thingselectronic.blogspot.ca/
Дата: 13.03.09 00:36
Оценка:
Здравствуйте, Аноним, Вы писали:

А>по-моему, 12.5 — не настолько большая точность чтобы у float'а были проблемы с его хранением....

А>если точно ((decimal)12.5 => (float)12.5) нельзя преобразовать тип, я согласен на исключение, а если точности хватает, хочу получать именно _тоже самое_ число...

"Хотеть не вредно — вредно не хотеть"(С)
[КУ] оккупировала армия.
Re: Научите меня преобразованию типов
От: _FRED_ Черногория
Дата: 13.03.09 03:29
Оценка:
Здравствуйте, Аноним, Вы писали:

А>с .NET мало знаком, поэтому сильно не пинать...

А>проблема проста:
А>Decimal d = 15.2m;
А>Single s = Convert.ToSingle(d); // s = 15.1999998, а надо 15.2 =)

Плавающая запятая
Автор(ы): Сергей Холодилов
Дата: 15.03.2008
Если яблоко поровну разделить на троих, каждому достанется треть. Так в нашу жизнь входят дроби, примерно с теми же целями входят они и в программирование.. Но реализация дробей в виде типов данных float/double ведёт себя не совсем "математично". В чём причина отличий, как минимизировать их влияние на результат вычислений, как же всё это всё-таки реализовано и почему запятая плавает — читайте в статье.
Help will always be given at Hogwarts to those who ask for it.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.