Здравствуйте, Аноним, Вы писали:
А>с .NET мало знаком, поэтому сильно не пинать...
А>проблема проста:
А>Decimal d = 15.2m; А>Single s = Convert.ToSingle(d); // s = 15.1999998, а надо 15.2 =)
Топик надо было называть "научите меня floating-point", никакого отношения к .NET это не имеет.
Открою тайну — не все десятичные цифры можно точно представить в виде чисел с плавающей точкой без потерь.
Это абсолютно нормальное поведение. Изучите как устроены floating-point числа, а потом курить в сторону Math.Round()
Здравствуйте, Пельмешко, Вы писали:
П>Открою тайну — не все десятичные цифры можно точно представить в виде чисел с плавающей точкой без потерь.
Пардон, не цифры, а числа конечно же
И с Вашим числом и округление не поможет, чё та я ступил
Single ss = 15.2f; // это тоже 15.1999998
Раз вы приводите число к типу, не гарантирующему необходимую Вам точность, к тому же тип вообще не может представить нужное Вами число, то какие могут быть вопросы?
Если где то отображаете число, то при приведении к строке с форматом "G" (оно по умолчанию) вы получите строку "15.2"
Re[3]: Научите меня преобразованию типов
От:
Аноним
Дата:
12.03.09 18:09
Оценка:
Здравствуйте, Пельмешко, Вы писали:
П>Здравствуйте, Пельмешко, Вы писали:
П>Раз вы приводите число к типу, не гарантирующему необходимую Вам точность, к тому же тип вообще не может представить нужное Вами число, то какие могут быть вопросы? П>Если где то отображаете число, то при приведении к строке с форматом "G" (оно по умолчанию) вы получите строку "15.2"
по-моему, 12.5 — не настолько большая точность чтобы у float'а были проблемы с его хранением....
если точно ((decimal)12.5 => (float)12.5) нельзя преобразовать тип, я согласен на исключение, а если точности хватает, хочу получать именно _тоже самое_ число...
А>по-моему, 12.5 — не настолько большая точность чтобы у float'а были проблемы с его хранением....
Дело не в точности числа (похоже вы понимаете его как количество десятичных знаков после запятой), а в количестве бит которое отводится на представление этого числа в памяти. Некоторые десятичные числа вообще невозможно записать точно в двоичной системе, требуется бесконечное количество бит. Посмотрите на двоичную запись 12.5 — сколько требуется бит для точной записи? Сравните с размером float.
Здравствуйте, Аноним, Вы писали:
А>по-моему, 12.5 — не настолько большая точность чтобы у float'а были проблемы с его хранением.... А>если точно ((decimal)12.5 => (float)12.5) нельзя преобразовать тип, я согласен на исключение, а если точности хватает, хочу получать именно _тоже самое_ число...
А>по-моему, 12.5 — не настолько большая точность чтобы у float'а были проблемы с его хранением....
Вот кстати с 12.5 проблем быть не должно.
А>я согласен на исключение
У других есть серьезные возражения. Все-таки получать исключение после почти каждого умножения/деления -- это чересчур.
Автор, почитай про способ хранения чисел с плавающей запятой. Приходи просветленный с новыми вопросами.
Здравствуйте, Аноним, Вы писали:
А>с .NET мало знаком, поэтому сильно не пинать... А>проблема проста: А>Decimal d = 15.2m; А>Single s = Convert.ToSingle(d); // s = 15.1999998, а надо 15.2 =)