在 JavaScript 中操作数据时,我应该避免在 C# 中使用小数类型吗

Should I avoid decimal type in C# when manipulating data in JavaScript

在当前项目中,恕我直言,我们使用了太多的十进制类型。我们使用 i.e. for 属性 就像在后端 (C#) 和前端 (JavaScript) 中计算(乘法、加法等)的质量。 JavaScript 中的数字类型始终是 64 位浮点数 (类似于 C# 中的 double)。将 double 转换为 decimal 并返回时,会出现转换失败的情况。

问题: JavaScript 中被操作的数据是否应该总是 double?

我创建了一个测试,显示此转换何时会在 C# 中失败。

[Fact]
public void Test()
{
    double value = 0.000001d;
    value *= 10;
    // Console.WriteLine(value); // 9.9999999999999991E-06
    ConvertToDecimalAndBack(value);
}

private static void ConvertToDecimalAndBack(double doubleValue)
{
    decimal decimalValue = (decimal)doubleValue;

    double doubleResult = (double)decimalValue;

    Assert.Equal(doubleValue, doubleResult);
}

我将您的问题 "Should the data being manipulated in JavaScript be always double?" 解释为与发展政策有关。正如您和评论所指出的,Javascript 中的最大精度是 double。此外,正如您所指出的,C# 十进制类型的精度高于 double,因此可能会出现转换问题。

通常数字在处理平台之间是一致的,特别是如果数字涉及金融交易或出于某种原因专门显示在 UI 中。

这里有两个选项,具体取决于具体要求。

如果您要求 JS 对原始十进制值进行操作,您应该在 C# 端制定使用 System.Decimal.ToDouble(System.Decimal) 的策略。

如果保留十进制值最重要(即金钱) 将涉及小数值的数值计算 保存在服务器上的一个地方