Страницы: 1
RSS
Появление несуществущих значений после запятой
 
Нужно было написать простейший макрос по закрашиванию ячеек, где есть значения после пятого знака после запятой.
Опыта в VBA нет, но написал вот что:
Код
Sub pyatznakow()
' pyatznakow Макрос
' Сочетание клавиш: Ctrl+Ы

   For Y = 1 To 256
   
   Z = Cells(Y, 1)
   U = Fix(Z * 100000)
   M = Z * 100000 - U
   If M > 0 Then Cells(Y, 1).Interior.Color = 31569
                 Cells(Y, 2) = U
                 Cells(Y, 3) = Z * 100000
                 Cells(Y, 4) = M
   Next Y  
End Sub
При работе макрос красит лишние ячейки. Например, для числа 1,1 при вычитании из числа (1,1*100000) его собственного округления получается разница 0,000000000014551915228366900000.

Как я понимаю, это некая проблема чисел с плавающей точкой. Существует ли способ её решить?
Изменено: PetrGG - 23.03.2018 13:41:18
 
PetrGG, используйте условие например If M > 0.00001 Then
Значение 1,123451 закрасится, 1,12345 - нет
Изменено: Казанский - 23.03.2018 12:58:03
 
Цитата
Казанский написал:
If M > 0.00001 Then
Боюсь, этот вариант не подойдёт. Выявляемый "хвост" может случайно оказаться меньше этого значения.
 
PetrGG, код следует оформлять соответствующим тегом. Ищите такую кнопку и исправьте своё сообщение.
 
Цитата
Юрий М написал:
код следует оформлять соответствующим тегом.
Буду иметь в виду.
 
Пробуйте округлять разницу максимум до 14 знаков, т.к. согласно спецификации именно в 15 значащем знаке чаще всего возникает ошибка.
Хотя все равно непонятна цель. Ведь Вы пишите:
Цитата
PetrGG написал:
есть значения после пятого знака после запятой
зачем чего-то вычитать? Почему не применить простое сравнение?
Код
int(activecell.value*100000)<>activecell.value*100000
потому что опять же, согласно спецификации, "хвосты" в разрядах наиболее вероятны именно при операции вычитания.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Цитата
Дмитрий Щербаков написал:
Пробуйте округлять разницу максимум до 14 знаков, т.к. согласно спецификации именно в 15
Это какие-то "костыли" получаются. Неужели единственный путь?

Цитата
Дмитрий Щербаков написал:
Почему не применить простое сравнение?
Не помогло.
 
Цитата
PetrGG написал:
Неужели единственный путь?
Excel неправильно считает. Почему?
а потом сами думайте. Я предложил два варианта решения. Один вроде как костыльный, другой более приемлемый, если опираться на озвученную задачу. Хотя уже не уверен, что задача озвучена верно, раз различия в 15-м разряде Вас так волнуют там, где должно было хватить проверки на неравенство с числом с этими самыми 5-ю знаками....
Еще вариант предложил Казанский. И вроде как он должен работать, т.к. различия покажет даже если они были не только в 6-м разряде.
Изменено: Дмитрий Щербаков - 23.03.2018 14:06:04
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Цитата
PetrGG написал:
где есть значения после пятого знака после запятой.
Значения после пятого знака после (десятичной) запятой есть у всех хранящихся в ячейках Excel чисел, кроме целых и рациональных со знаменателем, равным степени двойки (не превышающим определенного значения).
Владимир
Страницы: 1
Наверх