Точность с помощью VariantCopyInd - PullRequest
1 голос
/ 30 ноября 2011

Я использую VariantCopyInd.Источник содержит 1111.199999999.Однако после VariantCopyInd значение в получателе округляется до 1111.200000.Я хотел бы сохранить первоначальную стоимость.как этого достичь?

Ответы [ 2 ]

0 голосов
/ 30 ноября 2011

Я нашел очень хорошую ссылку от MSDN

введите описание ссылки здесь Ссылка ясно указывает на то, что любое число, длина которого больше 15, приведет к неверным результатам.

Возьмите 2 случая

1) 101126.199999999 сохранит правильное значение, поскольку длина равна 15. Нет преобразования или потери точности 2) 111.12345678912345 будет хранить неверное значение, так как длина 17. Преобразование будет сделано

0 голосов
/ 30 ноября 2011

Это не имеет ничего общего с VariantCopyInd, а лишь тот факт, что литерал в том виде, в котором он существует в коде, не имеет точного представления в формате с плавающей запятой, используемом внутри COM-вариантами.

Следовательно, нет способа достичь того, что вы хотите, кроме как использовать вариант типа ВАЛЮТА.Он будет иметь ограниченную точность, см. MSDN:

Типы CURRENCY используют внутреннее десятичное представление, так же как и литерал кода. Вам все равно придется обеспечить косвенную инициализацию (из string , а не с плавающей запятой / двойной литерал) в коде, чтобы предотвратить любые нежелательные эффекты представления.

Номер валюты, хранящийся в виде 8-байтового целого числа с двумя дополнениями, масштабированного на 10 000, чтобы получить число с фиксированной точкой с 15 цифрамислева от десятичной точки и 4 цифры справа.Этот IDispatch::GetTypeInforesentation обеспечивает диапазон от 922337203685477.5807 до -922337203685477.5808 .

Тип данных CURRENCY полезен для вычислений с использованием денег или для любых вычислений с фиксированной точкой, где точность особенно важна.

...