Arhn - архитектура программирования

Округление Excel VBA с двойными числами

Я пытаюсь выполнить очень точный расчет, используя двойные числа, относящиеся к ячейкам на моем листе. Во время тестирования я написал следующий код:

Sub MacroTest()

Dim opt As Worksheet
Set opt = Sheets("Optimisation")

Dim test As Double

test = CDec(opt.Cells(2, 10))

End Sub

В ячейке J2 находится десятичное значение - 3298,8599993 фунтов стерлингов ... однако при отладке кода ясно, что тестовый двойник принимает только -3298,86 в качестве значения. Я не понимаю, почему это могло быть так, потому что я думал, что двойники более точны, чем это. Большинство сообщений, которые я прочитал, похоже, думают, что использование CDec должно решить эту проблему, однако, как показано, это не работает для меня.

Примечание. Значение в J2 было рассчитано с использованием формулы, не уверен, что это имеет значение. Любая помощь приветствуется - спасибо.


  • Отформатирован ли Cell J2 для отображения количества цифр после точки. ? 21.07.2016
  • @ShaiRado Cell J2 в настоящее время отформатирован так, чтобы отображать 7 десятичных знаков 21.07.2016

Ответы:


1

В этом случае вы должны использовать opt.Cells(2, 10).Value2. свойство Range.Value2:

Единственное различие между этим свойством и свойством Value состоит в том, что свойство Value2 не использует типы данных Currency и Date. Вы можете возвращать значения, отформатированные с помощью этих типов данных, как числа с плавающей запятой, используя тип данных Double.

Таким образом, значение по умолчанию .Value вернет Currency, если ячейка отформатирована как валюта, а .Value2, тем не менее, вернет Double.

21.07.2016

2

Я пока не могу комментировать, но вот что не так с вашим кодом:

Вы используете формулу преобразования CDec для двойного типа данных, и результат этой функции снова помещается в двойной тип данных. Таким образом, вы ничего не добьетесь здесь с точки зрения точности.

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

В моем примере ячейка «A1» содержит десятичное число 3298,859999.

Dim varDec As Variant
varDec = CDec(Range("A1").Value2)

Debug.Print "Value in A1 : " & Format(varDec, "0.0000000000000000000000")

Прямое приведение переменной к Decimal-datatype невозможно в VBA, но Variant-datatype имеет Decimal-datatype как подтип.

Чтобы убедиться в этом сами: посмотрите в окно «Локальные переменные» в VBE во время отладки. Он покажет:

Expression : var
Value      : 3298.859999
Type       : Variant/Decimal

Справочная статья о точности чисел в Excel

21.07.2016
Новые материалы

Коллекции публикаций по глубокому обучению
Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

Представляем: Pepita
Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

Советы по коду Laravel #2
1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

3 способа решить квадратное уравнение (3-й мой любимый) -
1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

Создание VR-миров с A-Frame
Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

Демистификация рекурсии
КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..