Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - .NET

Страница: 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
FAS пишет:
чтобы значения были точными, чего не понять то?

А чего не сказать то?
Документацию по округлению, видимо, ты не видал? И не знаешь о Math.Round?

Ответить

Номер ответа: 7
Автор ответа:
 AgentFire



ICQ: 192496851 

Вопросов: 75
Ответов: 3178
 Профиль | | #7 Добавлено: 10.05.12 09:29
Cramper пишет:
Я в этих случаях использую выражение:

Ты ошибся топиком. Это тема для дотнета.

Ответить

Номер ответа: 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
FAS пишет:
а что, .NET вообще точно считать не умеет, без округлений?
Налицо образование максимум восьми класов и полное непонимание системы хранения значений с плавающей точкой в памяти.
Decimal умеет, без округлений.

Cramper пишет:Что может быть более понятного, чем название нужной автору функции? Послать письмо с распечаткой кода?
Это вы ошибаетесь, считая, что то, что вы написали понятно...

Ответить

Номер ответа: 11
Автор ответа:
 AgentFire



ICQ: 192496851 

Вопросов: 75
Ответов: 3178
 Профиль | | #11 Добавлено: 10.05.12 17:29
блин.
Cramper пишет:
Это вы ошибаетесь, считая, что то, что вы написали понятно...

Что может быть более понятного, чем название нужной автору функции? Послать письмо с распечаткой кода?

Ответить

Номер ответа: 12
Автор ответа:
 Cramper



Вопросов: 15
Ответов: 93
 Профиль | | #12 Добавлено: 11.05.12 08:54
Тогда так и нужно было писать "Эта тема касается функции dotnet" или решается с помощью функции dotnet и т.п. Где в вашем сообщении слово ФУНКЦИЯ? К сожалению эта общая болезнь, сейчас и учебники так пишутся, языком понятным только автору. Плюс засорение всякими новообразовниями типа топик, х..ик. Вроде русскоязыяный сайт, слов в великом и могучем что-ли не хватает?

Ответить

Номер ответа: 13
Автор ответа:
 AgentFire



ICQ: 192496851 

Вопросов: 75
Ответов: 3178
 Профиль | | #13 Добавлено: 11.05.12 09:35
Cramper пишет:
Тогда так и нужно было писать
Вверху. Если начать читать.. то можно увидеть. "Форум - .NET".

Cramper пишет:
 Где в вашем сообщении слово ФУНКЦИЯ?
Math.Round. опять же, это видно, только если смотреть и попытаться воспринимать буквы.

Cramper пишет:
Вроде русскоязыяный сайт, слов в великом и могучем что-ли не хватает?

Вроде люди программированием тут занимаются, английский как бы не лишний будет?

Ответить

Номер ответа: 14
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #14 Добавлено: 12.05.12 00:26
что там опять Double неправильно считает?

Ответить

Номер ответа: 15
Автор ответа:
 Morpheus



Вопросов: 224
Ответов: 3777
 Web-сайт: xury.zx6.ru
 Профиль | | #15
Добавлено: 28.06.12 17:12
Если кому надо точно 0.1 - округляйте. Даже Double не даёт абсолютной точности, это в формате представления дробных чисел заложено. Так, нельзя использовать сравнение дробных чисел оператором = или == (хотя ВБ добрый - в нём у меня прокатвыали и такие трюки)

Ответить

Страница: 1 | 2 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам