Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Числа с плавающей запятой - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Числа с плавающей запятой (Макросы/Sub)
Числа с плавающей запятой
soulriwer Дата: Пятница, 01.09.2023, 09:56 | Сообщение № 1
Группа: Пользователи
Ранг: Прохожий
Сообщений: 5
Репутация: 0 ±
Замечаний: 0% ±

Добрый день!

Объясните, пожалуйста, поведение редактора vba при работе с числами

ввожу
[vba]
Код
my_single = 3.2771908978135754327181811223434
[/vba]
исправляет на
[vba]
Код
my_single = 3.27719089781358
[/vba]

ввожу
[vba]
Код
my_double = 88.123456123456196785634532543543535
[/vba]
исправляет на
[vba]
Код
my_double = 88.1234561234562
[/vba]

А, например, значение 3.999999999999999 магическим образом превращается в 4#
 
Ответить
СообщениеДобрый день!

Объясните, пожалуйста, поведение редактора vba при работе с числами

ввожу
[vba]
Код
my_single = 3.2771908978135754327181811223434
[/vba]
исправляет на
[vba]
Код
my_single = 3.27719089781358
[/vba]

ввожу
[vba]
Код
my_double = 88.123456123456196785634532543543535
[/vba]
исправляет на
[vba]
Код
my_double = 88.1234561234562
[/vba]

А, например, значение 3.999999999999999 магическим образом превращается в 4#

Автор - soulriwer
Дата добавления - 01.09.2023 в 09:56
Serge_007 Дата: Пятница, 01.09.2023, 10:17 | Сообщение № 2
Группа: Админы
Ранг: Местный житель
Сообщений: 16475
Репутация: 2749 ±
Замечаний: ±

Excel 2016
Здравствуйте

Как объявляете переменные?


ЮMoney:41001419691823 | WMR:126292472390
 
Ответить
СообщениеЗдравствуйте

Как объявляете переменные?

Автор - Serge_007
Дата добавления - 01.09.2023 в 10:17
soulriwer Дата: Пятница, 01.09.2023, 10:23 | Сообщение № 3
Группа: Пользователи
Ранг: Прохожий
Сообщений: 5
Репутация: 0 ±
Замечаний: 0% ±

Serge_007,
[vba]
Код
Dim my_double As Double
    my_double = 3.999999999999999999
[/vba]
исправляет на [vba]
Код
my_double = 4#
[/vba]

[vba]
Код
Dim my_double As Double
    my_double = 121.15452535362323232323
[/vba]
исправляет (округляет) до [vba]
Код
my_double = 121.154525353623
[/vba]
 
Ответить
СообщениеSerge_007,
[vba]
Код
Dim my_double As Double
    my_double = 3.999999999999999999
[/vba]
исправляет на [vba]
Код
my_double = 4#
[/vba]

[vba]
Код
Dim my_double As Double
    my_double = 121.15452535362323232323
[/vba]
исправляет (округляет) до [vba]
Код
my_double = 121.154525353623
[/vba]

Автор - soulriwer
Дата добавления - 01.09.2023 в 10:23
Serge_007 Дата: Пятница, 01.09.2023, 10:32 | Сообщение № 4
Группа: Админы
Ранг: Местный житель
Сообщений: 16475
Репутация: 2749 ±
Замечаний: ±

Excel 2016
Попробуйте так:[vba]
Код
Dim my_double
    my_double = CDec("121,15452535362323232323")
[/vba]


ЮMoney:41001419691823 | WMR:126292472390
 
Ответить
СообщениеПопробуйте так:[vba]
Код
Dim my_double
    my_double = CDec("121,15452535362323232323")
[/vba]

Автор - Serge_007
Дата добавления - 01.09.2023 в 10:32
Gustav Дата: Пятница, 01.09.2023, 13:16 | Сообщение № 5
Группа: Друзья
Ранг: Участник клуба
Сообщений: 2733
Репутация: 1136 ±
Замечаний: 0% ±

начинал с Excel 4.0, видел 2.1
Интересно, не знал!
[vba]
Код
Sub testCDec()
    Dim my_dec1 'As Variant 'только не Double, а отдельного типа Decimal, увы, нету
    Dim my_dec2 'As Variant
    my_dec1 = CDec("12,345671234567123456712345678") '29 значащих цифр максимум
    my_dec2 = CDec("10,000000000000000000000000001")
    Debug.Print my_dec1 + my_dec2 '= 22,345671234567123456712345679
End Sub
[/vba]И приятно, что гугленье по строке "vba cdec function" уже на первой странице содержит ссылку на наш сайт yes :
http://www.excelworld.ru/stuff/vba_function/data_type/cdec/21-1-0-60


МОИ: Ник, Tip box: 41001663842605
 
Ответить
СообщениеИнтересно, не знал!
[vba]
Код
Sub testCDec()
    Dim my_dec1 'As Variant 'только не Double, а отдельного типа Decimal, увы, нету
    Dim my_dec2 'As Variant
    my_dec1 = CDec("12,345671234567123456712345678") '29 значащих цифр максимум
    my_dec2 = CDec("10,000000000000000000000000001")
    Debug.Print my_dec1 + my_dec2 '= 22,345671234567123456712345679
End Sub
[/vba]И приятно, что гугленье по строке "vba cdec function" уже на первой странице содержит ссылку на наш сайт yes :
http://www.excelworld.ru/stuff/vba_function/data_type/cdec/21-1-0-60

Автор - Gustav
Дата добавления - 01.09.2023 в 13:16
soulriwer Дата: Пятница, 01.09.2023, 13:40 | Сообщение № 6
Группа: Пользователи
Ранг: Прохожий
Сообщений: 5
Репутация: 0 ±
Замечаний: 0% ±

Serge_007, Gustav, хотелось бы, все же, ясности, почему с Single, Double так происходит...


Сообщение отредактировал soulriwer - Пятница, 01.09.2023, 13:40
 
Ответить
СообщениеSerge_007, Gustav, хотелось бы, все же, ясности, почему с Single, Double так происходит...

Автор - soulriwer
Дата добавления - 01.09.2023 в 13:40
Gustav Дата: Пятница, 01.09.2023, 14:23 | Сообщение № 7
Группа: Друзья
Ранг: Участник клуба
Сообщений: 2733
Репутация: 1136 ±
Замечаний: 0% ±

начинал с Excel 4.0, видел 2.1
почему с Single, Double так происходит

Потому что Double это 8 байт, а Single вообще 4. В вещественных числах один байт - это, грубо говоря, 2 десятичных разряда (две значащие цифры). Это только в целых числах байт содержит максимально число 255, а в вещественных - максимально 99. Т.е. один десятичный разряд это полбайта или 4 бита. Для цифр от 0 до 7 хватает и трёх бит, но надо же еще 8 и 9 приткнуть, поэтому и приходится 4-й бит привлекать. Ну, а дальше просто удобно - делить байт на две части по 4 бита, что и делают.

Соответственно, 8 байт x 2 цифры = 16 цифр. Плюс знак числа, плюс десятичная точка. Соответственно, по факту получается в зависимости от системной реализации число Double может содержать 15-17 цифр, о чем, кстати, говорит и Википедия. В VBA я, как раз, вижу 15 цифр.


МОИ: Ник, Tip box: 41001663842605

Сообщение отредактировал Gustav - Пятница, 01.09.2023, 14:38
 
Ответить
Сообщение
почему с Single, Double так происходит

Потому что Double это 8 байт, а Single вообще 4. В вещественных числах один байт - это, грубо говоря, 2 десятичных разряда (две значащие цифры). Это только в целых числах байт содержит максимально число 255, а в вещественных - максимально 99. Т.е. один десятичный разряд это полбайта или 4 бита. Для цифр от 0 до 7 хватает и трёх бит, но надо же еще 8 и 9 приткнуть, поэтому и приходится 4-й бит привлекать. Ну, а дальше просто удобно - делить байт на две части по 4 бита, что и делают.

Соответственно, 8 байт x 2 цифры = 16 цифр. Плюс знак числа, плюс десятичная точка. Соответственно, по факту получается в зависимости от системной реализации число Double может содержать 15-17 цифр, о чем, кстати, говорит и Википедия. В VBA я, как раз, вижу 15 цифр.

Автор - Gustav
Дата добавления - 01.09.2023 в 14:23
soulriwer Дата: Пятница, 01.09.2023, 14:33 | Сообщение № 8
Группа: Пользователи
Ранг: Прохожий
Сообщений: 5
Репутация: 0 ±
Замечаний: 0% ±

Gustav, Спасибо большое, но о чем тогда пишут здесь https://learn.microsoft.com/en-us....summary
Цитата
Single
-3.402823E38 to -1.401298E-45 for negative values
1.401298E-45 to 3.402823E38 for positive values
 
Ответить
СообщениеGustav, Спасибо большое, но о чем тогда пишут здесь https://learn.microsoft.com/en-us....summary
Цитата
Single
-3.402823E38 to -1.401298E-45 for negative values
1.401298E-45 to 3.402823E38 for positive values

Автор - soulriwer
Дата добавления - 01.09.2023 в 14:33
Gustav Дата: Пятница, 01.09.2023, 14:50 | Сообщение № 9
Группа: Друзья
Ранг: Участник клуба
Сообщений: 2733
Репутация: 1136 ±
Замечаний: 0% ±

начинал с Excel 4.0, видел 2.1
о чем тогда пишут здесь

ТАМ они пишут о том, что (если читать между строк) мантисса типа Single содержит 7 значащих цифр, что логично, если мои рассуждения выше относительно Double c 15 цифрами в мантиссе теперь распространить на Single, который в памяти в два раза короче. Ну, а порядок (экспонента) типа E38 или E-45 как раз, наверное, и хранится "где-нибудь внутри" последней (восьмой) "цифры".

Не смешивайте абсолютные значения чисел - от микроскопических до бесконечно гигантских - с количеством "выразительных" (значащих) цифр от начала числа слева (до буквы E). Для Single Вы можете задать громадное число (7 знаков мантиссы):
[vba]
Код
1.234567E+20
[/vba]
, которое соответствует обычному арифметическому виду (21 цифра):
[vba]
Код
123 456 700 000 000 000 000
[/vba]
но не можете его "уточнить" еще парой знаков "89" (9 знаков мантиссы):
[vba]
Код
1.23456789E+20
[/vba]
, которое соответствует обычному арифметическому виду (21 цифра):
[vba]
Код
123 456 789 000 000 000 000
[/vba]
потому что оно будет (явно или неявно) округлено (до 7 знаков мантиссы):
[vba]
Код
1.234568E+20
[/vba]
или до арифметического вида (без 8 и 9)
[vba]
Код
123 456 800 000 000 000 000
[/vba]
т.е. заключительные 8 и 9 пропали из числа, хотя и округлили последнюю 7 мантиссы до 8.

Запустите для наглядности следующий код:
[vba]
Код
Sub testSingle()
    Dim s As Single
    s = 1.23456789012345E+20
    Debug.Print s '= 1,234568E+20
End Sub
[/vba]


МОИ: Ник, Tip box: 41001663842605

Сообщение отредактировал Gustav - Пятница, 01.09.2023, 15:35
 
Ответить
Сообщение
о чем тогда пишут здесь

ТАМ они пишут о том, что (если читать между строк) мантисса типа Single содержит 7 значащих цифр, что логично, если мои рассуждения выше относительно Double c 15 цифрами в мантиссе теперь распространить на Single, который в памяти в два раза короче. Ну, а порядок (экспонента) типа E38 или E-45 как раз, наверное, и хранится "где-нибудь внутри" последней (восьмой) "цифры".

Не смешивайте абсолютные значения чисел - от микроскопических до бесконечно гигантских - с количеством "выразительных" (значащих) цифр от начала числа слева (до буквы E). Для Single Вы можете задать громадное число (7 знаков мантиссы):
[vba]
Код
1.234567E+20
[/vba]
, которое соответствует обычному арифметическому виду (21 цифра):
[vba]
Код
123 456 700 000 000 000 000
[/vba]
но не можете его "уточнить" еще парой знаков "89" (9 знаков мантиссы):
[vba]
Код
1.23456789E+20
[/vba]
, которое соответствует обычному арифметическому виду (21 цифра):
[vba]
Код
123 456 789 000 000 000 000
[/vba]
потому что оно будет (явно или неявно) округлено (до 7 знаков мантиссы):
[vba]
Код
1.234568E+20
[/vba]
или до арифметического вида (без 8 и 9)
[vba]
Код
123 456 800 000 000 000 000
[/vba]
т.е. заключительные 8 и 9 пропали из числа, хотя и округлили последнюю 7 мантиссы до 8.

Запустите для наглядности следующий код:
[vba]
Код
Sub testSingle()
    Dim s As Single
    s = 1.23456789012345E+20
    Debug.Print s '= 1,234568E+20
End Sub
[/vba]

Автор - Gustav
Дата добавления - 01.09.2023 в 14:50
soulriwer Дата: Пятница, 01.09.2023, 15:55 | Сообщение № 10
Группа: Пользователи
Ранг: Прохожий
Сообщений: 5
Репутация: 0 ±
Замечаний: 0% ±

Gustav, Спасибо большое! Все понял, невнимательно смотрел)
 
Ответить
СообщениеGustav, Спасибо большое! Все понял, невнимательно смотрел)

Автор - soulriwer
Дата добавления - 01.09.2023 в 15:55
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Числа с плавающей запятой (Макросы/Sub)
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!