Страница: 1 | 2 |
Вопрос: Дробные числа в VB .NET
Добавлено: 08.05.12 22:09
Автор вопроса: FAS
Опробовано на 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
Автор ответа:
AgentFire
ICQ: 192496851
Вопросов: 75
Ответов: 3178
Профиль | | #1
Добавлено: 08.05.12 23:53
В потере точности.
а Decimal еще и самая медленная
Номер ответа: 2
Автор ответа:
FAS
Вопросов: 2
Ответов: 6
Профиль | | #2
Добавлено: 09.05.12 00:24
Так а как быть?
Номер ответа: 3
Автор ответа:
AgentFire
ICQ: 192496851
Вопросов: 75
Ответов: 3178
Профиль | | #3
Добавлено: 09.05.12 13:25
Смотря что надо.
Номер ответа: 4
Автор ответа:
FAS
Вопросов: 2
Ответов: 6
Профиль | | #4
Добавлено: 09.05.12 15:14
чтобы значения были точными, чего не понять то?
Номер ответа: 5
Автор ответа:
Cramper
Вопросов: 15
Ответов: 93
Профиль | | #5
Добавлено: 10.05.12 08:46
Я в этих случаях использую выражение:
Str$(Int(X) + CInt(100 * (X - Int(X))) * 0.01))
Номер ответа: 6
Автор ответа:
AgentFire
ICQ: 192496851
Вопросов: 75
Ответов: 3178
Профиль | | #6
Добавлено: 10.05.12 09:28
чтобы значения были точными, чего не понять то?
А чего не сказать то?
Документацию по округлению, видимо, ты не видал? И не знаешь о Math.Round?
Номер ответа: 7
Автор ответа:
AgentFire
ICQ: 192496851
Вопросов: 75
Ответов: 3178
Профиль | | #7
Добавлено: 10.05.12 09:29
Я в этих случаях использую выражение:
Ты ошибся топиком. Это тема для дотнета.
Номер ответа: 8
Автор ответа:
FAS
Вопросов: 2
Ответов: 6
Профиль | | #8
Добавлено: 10.05.12 09:50
а что, .NET вообще точно считать не умеет, без округлений? Как вы себе представляете например калькулятор с округлениями?
Номер ответа: 9
Автор ответа:
Cramper
Вопросов: 15
Ответов: 93
Профиль | | #9
Добавлено: 10.05.12 10:40
"Ты ошибся топиком. Это тема для дотнета. "
Это вы ошибаетесь, считая, что то, что вы написали понятно...
Номер ответа: 10
Автор ответа:
AgentFire
ICQ: 192496851
Вопросов: 75
Ответов: 3178
Профиль | | #10
Добавлено: 10.05.12 17:29
а что, .NET вообще точно считать не умеет, без округлений?
Decimal умеет, без округлений.
Это вы ошибаетесь, считая, что то, что вы написали понятно...
Номер ответа: 11
Автор ответа:
AgentFire
ICQ: 192496851
Вопросов: 75
Ответов: 3178
Профиль | | #11
Добавлено: 10.05.12 17:29
блин.
Это вы ошибаетесь, считая, что то, что вы написали понятно...
Что может быть более понятного, чем название нужной автору функции? Послать письмо с распечаткой кода?
Номер ответа: 12
Автор ответа:
Cramper
Вопросов: 15
Ответов: 93
Профиль | | #12
Добавлено: 11.05.12 08:54
Тогда так и нужно было писать "Эта тема касается функции dotnet" или решается с помощью функции dotnet и т.п. Где в вашем сообщении слово ФУНКЦИЯ? К сожалению эта общая болезнь, сейчас и учебники так пишутся, языком понятным только автору. Плюс засорение всякими новообразовниями типа топик, х..ик. Вроде русскоязыяный сайт, слов в великом и могучем что-ли не хватает?
Номер ответа: 13
Автор ответа:
AgentFire
ICQ: 192496851
Вопросов: 75
Ответов: 3178
Профиль | | #13
Добавлено: 11.05.12 09:35
Тогда так и нужно было писать
Где в вашем сообщении слово ФУНКЦИЯ?
Вроде русскоязыяный сайт, слов в великом и могучем что-ли не хватает?
Вроде люди программированием тут занимаются, английский как бы не лишний будет?
Номер ответа: 14
Автор ответа:
Artyom
Разработчик
Вопросов: 130
Ответов: 6602
Профиль | | #14
Добавлено: 12.05.12 00:26
что там опять Double неправильно считает?
Номер ответа: 15
Автор ответа:
Morpheus
Вопросов: 224
Ответов: 3777
Web-сайт:
Профиль | | #15
Добавлено: 28.06.12 17:12
Если кому надо точно 0.1 - округляйте. Даже Double не даёт абсолютной точности, это в формате представления дробных чисел заложено. Так, нельзя использовать сравнение дробных чисел оператором = или == (хотя ВБ добрый - в нём у меня прокатвыали и такие трюки)