c# - C# asp.net 将具有长属性的对象传递给前端会更改它的值
问题描述
我正在构建一个带有 react.js 前端的应用程序(尽管我相当确定这与问题无关)和一个 asp.net 后端(针对 net5.0,不确定这是否相关)。当我调用后端 API 时,我得到一个对象,其中部分包括它根据传入的数据生成的 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;
}
控制台输出:ID in C# controller method: 9223372030653055062
Chrome 开发工具:
当我尝试访问前端的 ID 时,我得到了以 000 而不是 062 结尾的错误 ID。
编辑 1:有人建议这是因为 JavaScriptNumber.MAX_SAFE_INTEGER
小于我传递的值。我不相信这是原因,但也许我错了,有人可以启发我。在 JS 方面,我正在使用BigInt
,正是因为我传递的数字对于Number
. 问题是在我将结果解析为 JS 对象之前(除非 Chrome 自动执行此操作,导致问题中引用的图片)。
编辑 2:根据下面的答案,看起来 JS 在我将其解析为 BigInt 之前将其解析为一个数字,所以我仍然在失去精度。更熟悉网络的人可以证实这一点吗?
解决方案
JavaScript 将该值解释为number
64 位浮点数。如果您想保留该值,最好将其作为字符串传回。
演示问题的示例 JS:
var value = 9223372030653055062;
console.log(value);
console.log(typeof(value));
推荐阅读
- github - 在 GitLab 中使用 CURL
- java - 来自 tFileInputMail 的无法解析的日期
- kotlin - 使用 kotlin 作用域函数和 elvis 运算符进行 val 初始化
- java - Azure IMDS + Java SDK
- c# - 如何从实例化/克隆的游戏对象中获取 TextMeshProUGUI 组件?
- azure - Azure Powershell Get-AzWebAppSlot AppSettings 始终为空
- java - 在 websocket java 中禁用 SSL 认证
- c# - Microsoft Graph API - 发送读取文件的请求时出错
- html - 在 Atom 中,当它尝试使用包(在浏览器中打开)打开 html 文件时,它会显示错误:错误:退出代码 4。(使用的操作系统-Linux Ubuntu)
- powershell - Powershell:在txt文件的每2行插入一个换行符