Вопрос: Дробные числа в VB .NET | Добавлено: 08.05.12 22:09 |
Автор вопроса: ![]() |
Опробовано на 2008 и 2010 версии, типах переменных Single и Double
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim X As Single For X = 0 To 1 Step 0.01 TextBox1.AppendText(Str(X) & Chr(13) & Chr(10)) Next End Sub Результат неожиданный... 0 0.01 0.02 0.03 0.04 0.05 0.05999999 0.06999999 0.07999999 0.08999999 0.09999999 0.11 0.12 0.13 0.14 0.15 0.16 0.17 0.18 0.19 0.2 0.21 0.22 0.23 0.24 0.25 0.26 0.27 0.28 0.29 0.3 0.31 0.32 0.33 0.3399999 0.3499999 0.3599999 0.3699999 0.3799999 0.3899999 0.3999999 0.4099999 0.4199999 0.4299999 0.4399998 0.4499998 0.4599998 0.4699998 0.4799998 0.4899998 0.4999998 0.5099998 0.5199998 0.5299998 0.5399998 нормально работает только переменная типа Decimal, но как то не хочется без нужды использовать массивы переменных по 16 байт В чем причина? |
Ответы | Всего ответов: 16 |
Номер ответа: 1 Автор ответа: ![]() ![]() ![]() ![]() ICQ: 192496851 Вопросов: 75 Ответов: 3178 |
Профиль | Цитата | #1 | Добавлено: 08.05.12 23:53 |
В потере точности.
а Decimal еще и самая медленная |
Номер ответа: 2 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() Вопросов: 2 Ответов: 6 |
Профиль | Цитата | #2 | Добавлено: 09.05.12 00:24 |
Так а как быть? |
Номер ответа: 3 Автор ответа: ![]() ![]() ![]() ![]() ICQ: 192496851 Вопросов: 75 Ответов: 3178 |
Профиль | Цитата | #3 | Добавлено: 09.05.12 13:25 |
Смотря что надо. |
Номер ответа: 4 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() Вопросов: 2 Ответов: 6 |
Профиль | Цитата | #4 | Добавлено: 09.05.12 15:14 |
чтобы значения были точными, чего не понять то? |
Номер ответа: 5 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Вопросов: 15 Ответов: 93 |
Профиль | Цитата | #5 | Добавлено: 10.05.12 08:46 |
Я в этих случаях использую выражение:
Str$(Int(X) + CInt(100 * (X - Int(X))) * 0.01)) |
Номер ответа: 6 Автор ответа: ![]() ![]() ![]() ![]() ICQ: 192496851 Вопросов: 75 Ответов: 3178 |
Профиль | Цитата | #6 | Добавлено: 10.05.12 09:28 |
FAS пишет:
чтобы значения были точными, чего не понять то? А чего не сказать то? Документацию по округлению, видимо, ты не видал? И не знаешь о Math.Round? |
Номер ответа: 7 Автор ответа: ![]() ![]() ![]() ![]() ICQ: 192496851 Вопросов: 75 Ответов: 3178 |
Профиль | Цитата | #7 | Добавлено: 10.05.12 09:29 |
Cramper пишет:
Я в этих случаях использую выражение: Ты ошибся топиком. Это тема для дотнета. |
Номер ответа: 8 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() Вопросов: 2 Ответов: 6 |
Профиль | Цитата | #8 | Добавлено: 10.05.12 09:50 |
а что, .NET вообще точно считать не умеет, без округлений? Как вы себе представляете например калькулятор с округлениями? |
Номер ответа: 9 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Вопросов: 15 Ответов: 93 |
Профиль | Цитата | #9 | Добавлено: 10.05.12 10:40 |
"Ты ошибся топиком. Это тема для дотнета. "
Это вы ошибаетесь, считая, что то, что вы написали понятно... |
Номер ответа: 10 Автор ответа: ![]() ![]() ![]() ![]() ICQ: 192496851 Вопросов: 75 Ответов: 3178 |
Профиль | Цитата | #10 | Добавлено: 10.05.12 17:29 |
FAS пишет:
Налицо образование максимум восьми класов и полное непонимание системы хранения значений с плавающей точкой в памяти.
а что, .NET вообще точно считать не умеет, без округлений? Decimal умеет, без округлений. Cramper пишет:Что может быть более понятного, чем название нужной автору функции? Послать письмо с распечаткой кода?
Это вы ошибаетесь, считая, что то, что вы написали понятно... |
Номер ответа: 11 Автор ответа: ![]() ![]() ![]() ![]() ICQ: 192496851 Вопросов: 75 Ответов: 3178 |
Профиль | Цитата | #11 | Добавлено: 10.05.12 17:29 |
блин.
Cramper пишет:
Это вы ошибаетесь, считая, что то, что вы написали понятно... Что может быть более понятного, чем название нужной автору функции? Послать письмо с распечаткой кода? |
Номер ответа: 12 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Вопросов: 15 Ответов: 93 |
Профиль | Цитата | #12 | Добавлено: 11.05.12 08:54 |
Тогда так и нужно было писать "Эта тема касается функции dotnet" или решается с помощью функции dotnet и т.п. Где в вашем сообщении слово ФУНКЦИЯ? К сожалению эта общая болезнь, сейчас и учебники так пишутся, языком понятным только автору. Плюс засорение всякими новообразовниями типа топик, х..ик. Вроде русскоязыяный сайт, слов в великом и могучем что-ли не хватает? |
Номер ответа: 13 Автор ответа: ![]() ![]() ![]() ![]() ICQ: 192496851 Вопросов: 75 Ответов: 3178 |
Профиль | Цитата | #13 | Добавлено: 11.05.12 09:35 |
Cramper пишет:
Вверху. Если начать читать.. то можно увидеть. "Форум - .NET".
Тогда так и нужно было писать Cramper пишет:
Math.Round. опять же, это видно, только если смотреть и попытаться воспринимать буквы.
Где в вашем сообщении слово ФУНКЦИЯ? Cramper пишет:
Вроде русскоязыяный сайт, слов в великом и могучем что-ли не хватает? Вроде люди программированием тут занимаются, английский как бы не лишний будет? |
Номер ответа: 14 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Разработчик Вопросов: 130 Ответов: 6602 |
Профиль | Цитата | #14 | Добавлено: 12.05.12 00:26 |
что там опять Double неправильно считает? |
Номер ответа: 15 Автор ответа: ![]() ![]() ![]() ![]() ![]() Вопросов: 224 Ответов: 3777 |
Web-сайт: Профиль | Цитата | #15 | Добавлено: 28.06.12 17:12 |
Если кому надо точно 0.1 - округляйте. Даже Double не даёт абсолютной точности, это в формате представления дробных чисел заложено. Так, нельзя использовать сравнение дробных чисел оператором = или == (хотя ВБ добрый - в нём у меня прокатвыали и такие трюки) |
|