在 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)
的策略。
如果保留十进制值最重要(即金钱)
将涉及小数值的数值计算 保存在服务器上的一个地方 。
在当前项目中,恕我直言,我们使用了太多的十进制类型。我们使用 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)
的策略。
如果保留十进制值最重要(即金钱) 将涉及小数值的数值计算 保存在服务器上的一个地方 。