Я использую VariantCopyInd. Источник содержит 1111.199999999. Однако после VariantCopyInd значение округляется в месте назначения до 1111.200000. Я хотел бы сохранить исходное значение. как этого можно добиться?
Точность с использованием VariantCopyInd
Ответы (2)
Это не имеет никакого отношения к VariantCopyInd, а просто к тому факту, что литерал в том виде, в каком он существует в коде, не имеет точного представления в формате с плавающей запятой, используемом внутри COM Variants.
Следовательно, нет никакого способа добиться того, чего вы хотите, кроме как использовать вариант типа CURRENCY. Он будет иметь ограниченную точность, см. MSDN:
Типы CURRENCY используют внутри себя десятичное представление, как и кодовый литерал. Вам все равно придется обеспечить косвенную инициализацию (из строки, а не литерала с плавающей запятой/двойного числа) в коде, чтобы предотвратить любые нежелательные эффекты представления.
Число валюты, хранящееся как 8-байтовое целое число с дополнением до двух, масштабированное на 10 000, чтобы получить число с фиксированной запятой с 15 цифрами слева от десятичной точки и 4 цифрами справа. Этот
IDispatch::GetTypeInforesentation
предоставляет диапазон от 922337203685477,5807 до -922337203685477,5808.Тип данных
CURRENCY
полезен для вычислений, связанных с деньгами, или для любых вычислений с фиксированной точкой, где особенно важна точность.
VARIANT
— это размеченный союз. Если вы сохраняете значение CURRENCY
в VARIANT
, приведение не происходит. Чтобы использовать значение в двойной арифметике, вы можете использовать (double) dblVariant.cyVal.int64 / 10000.0
. Несомненно, у CComVariant есть геттеры для этого, но и MSDN в вашем распоряжении.
- person sehe; 30.11.2011
Я нашел очень хорошую ссылку из msdn
введите здесь описание ссылки Ссылка четко указывает любое число, длина которого больше 15 будет оцениваться как неправильный результат.
Возьмите 2 случая
1) 101126.199999999 будет хранить правильное значение, так как длина равна 15. Без преобразования или потери точности 2) 111.12345678912345 будет хранить неверное значение, поскольку длина равна 17 . Преобразование будет выполнено
might not exactly approximate the decimal number
и A value might not roundtrip if a floating-point number is involved
. Это не имеет ничего общего с десятичными значащими цифрами (на самом деле выборка из OP меньше 15 цифр).
- person sehe; 30.11.2011