Bri*_*ian 5 c# asp.net asp.net-core .net-5
我正在构建一个带有react.js前端(尽管我相当确定这与问题无关)和asp.net后端(针对net5.0,不确定是否相关)的应用程序。当我调用后端 API 时,我会返回一个对象,其中部分包含它根据传入的数据生成的 ID,该 ID 的类型为 C# 中的 long(64 位 int)。我看到的行为是 C# 中的变量和从前端响应中读取的变量是不同的。它们似乎在大约 16-17 位数字后发生漂移。
这是预期的吗?有什么办法可以绕过它吗?
重现代码/我所看到的图片:
C#
[HttpPost]
[Route("test")]
public object TestPassingLongInObject()
{
/* actual logic omitted for brevity */
var rv = new
{
DataReadIn = new { /* omitted */ },
ValidationResult = new ValidationResult(),
GeneratedID = long.Parse($"922337203{new Random().Next(int.MaxValue):0000000000}") // close to long.MaxValue
};
Console.WriteLine($"ID in C# controller method: {rv.GeneratedID}");
return rv;
}
Run Code Online (Sandbox Code Playgroud)
控制台输出:ID in C# controller method: 9223372030653055062
Chrome 开发工具:
当我尝试访问前端的 ID 时,我得到以 000 而不是 062 结尾的错误 ID。
编辑 1:有人建议这是因为 JavaScript 的值Number.MAX_SAFE_INTEGER小于我传递的值。我不相信这是原因,但也许我错了,有人可以启发我。在 JS 方面,我使用BigInt,正是因为我传递的数字对于 来说太大了Number。问题是在我将结果解析为 JS 对象之前(除非 Chrome 会自动执行此操作,从而导致问题中引用的图片)。
编辑2:根据下面的答案,看起来JS可能在我将值解析为BigInt之前将其解析为数字,所以我仍然失去精度。有更熟悉网络的人可以证实这一点吗?
JavaScript 将该值解释为number64 位浮点数。如果您想保留该值,最好将其作为字符串传回。
演示该问题的示例 JS:
var value = 9223372030653055062;
console.log(value);
console.log(typeof(value));Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1055 次 |
| 最近记录: |