K3JAE Ответов: 2

Расчет средней стоимости топлива


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

Мои фрагменты кода выглядят следующим образом:

Private Sub calc()

        Dim 
            a, f1, f2, f3, f4, f5, f6 As Decimal
        Try
            f1 = CDec(IIf(tbTruckFuelPurchased.Text.Trim = "", 0D, tbTruckFuelPurchased.Text.Trim))
            f2 = CDec(IIf(tbReeferFuelPurchased.Text.Trim = "", 0D, tbReeferFuelPurchased.Text.Trim))
            f3 = CDec(IIf(tbDEFPurchased.Text.Trim = "", 0D, tbDEFPurchased.Text.Trim))
            f4 = CDec(IIf(tbGalsPurch.Text.Trim = "", 0D, tbGalsPurch.Text.Trim))
            f5 = CDec(IIf(tbREF_Gals.Text.Trim = "", 0D, tbREF_Gals.Text.Trim))
            f6 = CDec(IIf(tbFuelCostAvg.Text.Trim = "", 0D, tbFuelCostAvg.Text.Trim))
        Catch ex As Exception
            'If a calculation error occurs, show Error message box
            Dim frm As New MeMsgCalcError(ex, "Error in 'Calculation DIM Statement' Defining Area.")
            frm.Show()
        End Try


        'Calculate Average Cost of Fuel this Load
        Try
            a = f1 \ f4
            tbFuelCostAvg.Text = a.ToString("C2")
        Catch ex As Exception
            'If a calculation error occurs, show Error message box
            Dim frm As New MeMsgCalcError(ex, "Calculation Error in 'Average Cost of Fuel this Load.'")
            frm.Show()
        End Try


Это приводит к ошибкам.:
Ошибка BC30512 Вариант Строго По запрещает неявные преобразования из "десятичного" в "длинный".

Как отмечалось выше в сообщении об ошибке, опция Strict включена и должна быть включена.

Как я могу взять общее количество купленного топлива (tbTruckFuelPurchased (валюта)) и разделить общее количество купленных галлонов топлива (tbGalsPurch (целое число плюс 3 десятичных знака), чтобы получить среднюю стоимость за галлон? Очевидно, я ищу возвращаемое значение "деньги", округленное до 2 десятичных знаков.

Я не понимаю преобразования десятичного числа в длинное сообщение об ошибке.

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

Код и попытки см. В разделе сообщение.

Richard Deeming

Где вы определили переменную a, и что это за тип данных?

K3JAE

Извиняюсь: я вырезал это из кода... var a включен в оператор DIM f1-f6, поэтому по существу добавьте a в оператор DIM.

Я исправлю приведенный выше фрагмент кода.

2 Ответов

Рейтинг:
16

Richard Deeming

Проблема в этой линии:

a = f1 \ f4

То \ оператор выполняет целое число деление и возвращает целочисленный тип, соответствующий типам операндов:
\ Оператор (Visual Basic)[^]

Вам нужно выполнить стандартное деление, используя / оператор:
a = f1 / f4


K3JAE

Мистер Диминг попал в самую точку-у меня было деление на "знак" задом наперед. Дох!!!

Richard Deeming

Два варианта:

1) Изменение переменных из Decimal к Double (и перемены CDec к CDbl). Тогда вы получите либо то, либо другое Double.NaN, Double.PositiveInfinity, или Double.NegativeInfinity, в зависимости от числителя.

2) Используйте If инструкция для обхода вычисления, если знаменатель равен нулю:
a = If(f4 = 0, 0, f1 / f4)

Maciej Los

5ед!

Рейтинг:
0

OriginalGriff

Поскольку все ваши переменные "fn" объявлены как десятичные, и в фрагменте кода есть только одно другое назначение, это должна быть эта строка:

a = f1 \ f4
А это значит, что a должен быть Long и опция strict не позволит вам просто присвоить десятичное значение длинной переменной, так как она должна будет выбросить любые данные справа от десятичной точки. для этого - Long-это целочисленный тип данных, который не может содержать дробные значения.
Так либо проверьте и измените определение a в десятичную дробь, или приведите десятичную дробь к длинному значению:
a = CLng(f1) \ CLng(f4)


Кстати: сделайте себе одолжение и не используйте такие имена переменных, как f1, f2, или a - используйте более длинные имена, которые лучше описывают то, что содержит значение. Это делает ваш код намного более читабельным и надежным!

[edit]changign a won;t help - я забыл, что оператор \ выдает ошибку, если опция Stricty включена и вы предоставляете значения с плавающей запятой: https://msdn.microsoft.com/en-us/library/0e16fywh.aspx?f=255&MSPPError=-2147217396[^] [/редактировать]