Member 14076249 Ответов: 1

Как я могу предотвратить двойное неправильное вычитание десятичной дроби


я всегда получаю неправильное десятичное число в 3-й записи цикла i. Если я использую калькулятор, то получаю правильный результат, но если я помещаю его в excel, то получаю неправильный результат в десятичной системе счисления. что я хочу, так это иметь тот же результат в excel и моей системе

например.

мой результат в excel для принципала составляет 765 517,81,но для 3-й записи я получаю 769 345,39


ниже приведен мой код.


Тусклый баланс как двойной = 25600000
Дим pmtmonthlyamortization как дважды = 893517.81
Dim interestrate As Double = 6.0 / 100

Dim TotPmts As Double
Тусклый мпринципал как двойной
Тусклый minterest как двойной

TotPmts = CDbl(Val(5))

Для i = 0 до TotPmts
minterest = (баланс * (interestrate / 12))
mprincipal = (pmtmonthlyamortization - minterest)
баланс = (баланс - mprincipal)

С помощью MsgBox(minterest &амп; vbNewLine &амп; mprincipal &амп; vbNewLine &амп; vbNewLine &амп; баланс)
Следующий

Что я уже пробовал:

я уже пробовал использовать DOUBLE,DECIMAL,LONG

Richard MacCutchan

Не используйте Double для финансовых расчетов; используйте десятичный тип, вот для чего он был разработан.

Member 14076249

я уже пробовал использовать десятичную систему счисления, но продолжаю получать ту же ошибку с десятичной системой счисления

Richard MacCutchan

Вы не получаете ошибку, вы получаете другое значение.

Member 14076249

да! я получаю 769,345.39 вместо 769,345.40 ,системное значение равно 769,345.39905

Richard MacCutchan

Это просто округление различий.

Member 14076249

но как мне показать ему то, что я точно хочу, как 769,345.40 не .39

Richard MacCutchan

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

Interest: 128000.0000  Principal: 765517.8100  Balance: 24834482.1900
Interest: 124172.4109500  Principal: 769345.3990500  Balance: 24065136.7909500
Interest: 120325.6839547500  Principal: 773192.1260452500  Balance: 23291944.6649047500
Interest: 116459.7233245237500  Principal: 777058.0866754762500  Balance: 22514886.5782292737500
Interest: 112574.4328911463687500  Principal: 780943.3771088536312500  Balance: 21733943.2011204201187500
Interest: 108669.7160056021005937500  Principal: 784848.0939943978994062500  Balance: 20949095.1071260222193437500

Richard MacCutchan

И когда я использую Decimal.Round(value, 2) Я получаю:

Interest: 128000.00  Principal: 765517.81  Balance: 24834482.19
Interest: 124172.41  Principal: 769345.40  Balance: 24065136.79
Interest: 120325.68  Principal: 773192.13  Balance: 23291944.66
Interest: 116459.72  Principal: 777058.09  Balance: 22514886.58
Interest: 112574.43  Principal: 780943.38  Balance: 21733943.20
Interest: 108669.72  Principal: 784848.09  Balance: 20949095.11

Member 14076249

но куда мне девать эту десятичную дробь?Round(value,2) ?, exatly это результат, который я хочу, но некоторые десятичные числа не совпадают с excel, 3-я запись в основном должна быть .12, как в excel, а для баланса 3-я .66 должна быть .67, как в excel то же самое происходит с пятой записью .20 = .21

Richard MacCutchan

Я использовал только десятичную дробь.Вызов Round() в точке, где я отображал значения. Не используйте его на этапах расчета.

Member 14076249

я попробовал использовать десятичную дробь.Round(value,2) Да, это решает 2-ю запись от округления, но следующая проблема возникает в 3-й записи

[ Принципал: 773192.13 ] и значение, которое мне нужно показать, таково:
[ 773192.12 ] потому что это результат в excel и потому что он округляется для принципала, результат в балансе идет вверх

это результат в excel, вы заметите, что я ставлю некоторые +1 или -1 -2 это результат в моей системе он продолжает вычитание или добавление у меня есть -0.05 в моем балансе в качестве конечного результата

Основной Капитал: 765517.81 Проценты: 128000.00 Остаток Средств: 24834482.19
Основной Капитал: 769345.40 Проценты: 124172.41 Остаток Средств: 24065136.79
Основной Капитал: 773192.12+1 Проценты: 120325.68 Остаток Средств: 23291944.67 -1
Основной Капитал: 777058.09 Проценты: 116459.72 Остаток Средств: 22514886.58 -1
Основной Капитал: 780943.38 Проценты: 112574.43 Остаток Средств: 21733943.21 -2

Member 14076249

[ Системный Результат ]

Основной Капитал: 765517.81 Проценты: 128000.00 Остаток Средств: 24834482.19
Основной Капитал: 769345.40 Проценты: 124172.41 Остаток Средств: 24065136.79
Основной Капитал: 773192.13 +1 Проценты: 120325.68 Остаток Средств: 23291944.66 -1
Основной Капитал: 777058.09 Проценты: 116459.72 Остаток Средств: 22514886.57 -1
Основной Капитал: 780943.38 Проценты: 112574.43 Остаток Средств: 21733943.19 -2
Основной Капитал: 784848.09 Проценты: 108669.72 Остаток Средств: 20949095.11 -1

1 Ответов

Рейтинг:
0

OriginalGriff

Начните с точного сравнения того, что Excel делает с вашим кодом: мы не можем видеть ваш лист, поэтому мы понятия не имеем!

И эта разница в стоимости слишком велика, чтобы быть какой-то проблемой точности, поэтому наиболее вероятное объяснение простое: "два кода делают разные вещи"
Если вы можете увидеть это сразу, то начните внимательно изучать:

Скопируйте расчет ячеек Excel и разбейте его на несколько ячеек, чтобы точно имитировать то, что есть в вашем VB-коде. Соответствует ли результат вашему коду или Excel?
Если он соответствует вашему коду, то вычисление excel в одной ячейке не делает того, что вы думаете!
Если он соответствует листу, то посмотрите на разницу в "сжатой" и "развернутой" версиях.


Member 14076249

у меня есть то же самое вычисление в excel, но моя проблема заключается в том, почему я не получаю точное значение для десятичной дроби.

OriginalGriff

Я хочу сказать: откуда вы знаете, что это одно и то же? Мы не можем видеть их обоих, поэтому мы понятия не имеем, правильно ли вы перевели его - и эта погрешность огромна!

Member 14076249

для получения результата в excel
765,517.81
769,345.40

Результат в моей системе
765,517.81
769,345.39

OriginalGriff

Это несколько отличается от цифр, которые Вы нам дали в первый раз:

-765 517,81 но за 3-ю запись я получаю 769 345,39"

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

Member 14076249

да, я пробовал использовать add watch, и для фактического значения это 769,345.39905 в моей системе, кстати, это в цикле for, так что мне нужно вычесть это 31 раз, или это зависит от того, что я ввожу. я получаю точный результат, но не для десятичной дроби.

OriginalGriff

Ну вот и все.
Это не "реальная ошибка", а просто округление "по умолчанию".
Excel округляет значение ".39905" до ".40" для отображения, вероятно, на основе стиля ячейки, а ваш код-нет, потому что к данным не был применен никакой стиль.

Проверьте форматирование ячеек, и вы, вероятно, обнаружите, что оно установлено на два десятичных знака, и excel округлит его до этого, вероятно, используя "округление до четного" - что является значением по умолчанию в некоторых системах!

Видеть здесь:
https://www.codeproject.com/Tips/1272542/How-NETs-Math-Round-has-Nothing-to-do-with-Maths-A
Это может помочь вам понять, что происходит.

Member 14076249

можете ли вы сказать мне простым способом, как использовать Round half up я немного запутался или как мне поместить его в свою программу без серьезных изменений?

OriginalGriff

Любой из струн.Методы форматирования будут работать:
Dim d As Double = 769345.39905
Приставка.WriteLine(d)
Приставка.WriteLine("{0:0.00}", d)
Приставка.WriteLine(Строка.Формат("{0:0.00}", d))
Приставка.WriteLine(Математика.Раунд(d, 2))
Приставка.WriteLine(Математика.Раунд(d, 2, MidpointRounding.AwayFromZero))
Приставка.WriteLine(Математика.Раунд(d, 2, MidpointRounding.ToEven))
Только первый напечатает все, чего нет ".4":
769345.39905
769345.40
769345.40
769345.4
769345.4
769345.4

И сделайте себе одолжение: прекратите использовать устаревшие методы VB6 ... MsgBox был заменен более десяти лет назад классом MessageBox ...

Member 14076249

извините, что я тоже использую класс MessageBox, но спасибо!

OriginalGriff

Хм... - вы уверены?

С помощью MsgBox(minterest &амп; vbNewLine &амп; mprincipal &амп; vbNewLine &амп; vbNewLine &амп; баланс)

Member 14076249

MsgBox я использую это только для примера. хе-хе

Member 14076249

я думаю, что у меня есть другая проблема вместо того, чтобы
773192.12 за проценты я получаю 773192.13

а для принципала или баланса
23291944.66 вместо 23291944.67