Десятичное деление VBScript на целое число возвращает дополнительный остаток - PullRequest
0 голосов
/ 03 июля 2018

Я пытаюсь проверить мою функцию VBScript, которая делит входное значение на 1440. Когда я передаю 43.56 в качестве входного параметра, он возвращает мне следующий результат:

0.030250000000000002

пока правильный ответ

0.03025

Что я должен сделать, чтобы он работал правильно как с равномерно разделенными целыми числами, такими как 1440/1440 = 1, так и когда одно значение является десятичным. В настоящее время моя функция выглядит так:

Function convertMinutesToDays(value)
    If IsNumeric(value) And TypeName(value) <> "Boolean" Then
        convertMinutesToDays = value / 1440
    Else
        convertMinutesToDays = 0
    End If
End Function

На самом деле, если вы просто поместите Response.Write convertMinutesToDays (43.56), он покажет 0.03025, но мы используем его в методе assert javascript, например:

Call AssertAreEqual(convertMinutesToDays(43.56), 0.03025, "convertMinutesToDays: pass 43.56 should return 0.03025")

код JavaScript:

<script language="JavaScript" runat="server">
    function AssertAreEqual(val1, val2, message)
    {
        var retVal = false;
        var divAttributes = "";
        var equality = "";
        if (val1 === val2)
        {
            divAttributes = "class=\"unittest assertareequal pass\"";
            equality = "=";
            retVal = true;
        }
        else
        {
            divAttributes = "class=\"unittest assertareequal fail\"";
            equality = "!=";
            retVal = false;
        }
        Response.Write("<div " + divAttributes + ">Actual:" + val1 + " " + equality  + " " + val2 + ":Expected | " + message + "</div>");
        return retVal;
    }
</script>

Выход:

Actual:0.030250000000000002 != 0.03025:Expected | convertMinutesToDays: pass 43.56 should return 0.03025

Есть идеи?

1 Ответ

0 голосов
/ 03 июля 2018

Это связано с тем, как математика с плавающей запятой работает в VBScript (ну, в большинстве случаев, на любом языке). Для вашего кода должна быть достаточна функция округления, потому что вы всегда делите на одно число, чтобы ошибки округления не накапливались, как в других типах функций. Я выбрал 5 знаков после запятой, потому что это исправляет ваш пример. Если вы найдете других людей, которые все еще не работают, вам может потребоваться увеличить это количество, но для представления неполных дней 5, вероятно, достаточно.

Function convertMinutesToDays(value)
    If IsNumeric(value) And TypeName(value) <> "Boolean" Then
        convertMinutesToDays = Round(value / 1440, 5)
    Else
        convertMinutesToDays = 0
    End If
End Function
...