24848威尼斯(中国)有限公司

前后端交互,在前端获取长整型数据精度丢失问题

发布于: 2024-09-27    浏览: 647    作者:系统管理员

1. 问题描述

描述:在前端访问到后端接口的过程中,Long类型数据精度,末尾三位数被归零

1.1.后端

1.1.1.后端数据类型

1. /// 

  

2. /// 表单类型  

3. /// 

  

4. public class FormType  

5. {  

6.     /// 

  

7.     /// 类型编号  

8.     /// 

  

9.     public long TypeID { get; set; }  

10.     /// 

  

11.     /// 类型编码  

12.     /// 

  

13.     public string TypeCode { get; set; }  

14.     /// 

  

15.     /// 类型名称  

16.     /// 

  

17.     public string TypeName { get; set; }  

18.     /// 

  

19.     /// 创建时间  

20.     /// 

  

21.     public DateTime CreateTime { get; set; }  

22. }  

 

1.1.2.后端接口

1. public class FormTypeController : ApiController  

2. {  

3.     /// 

  

4.     /// 获取表单类型集合  

5.     /// 

  

6.     ///   

7.     public IHttpActionResult GetFormTypes()  

8.     {  

9.         List formTypes = new List();  

10.         formTypes.Add(new FormType { TypeID = 8484382934839484333, TypeCode = "tps", TypeName = "尿液基蒲层细胞检测申请单", CreateTime = DateTime.Now });  

11.         formTypes.Add(new FormType { TypeID = 8484382934839484334, TypeCode = "tct", TypeName = "液基薄层细胞学检测申请单", CreateTime = DateTime.Now });  

12.         return Json>(formTypes);  

13.     }  

14. }  


1.2.前端

1.2.1.前端访问

1.   

2.  


1.2.2.前端访问结果



2.问题分析

在前后端数据交互的过程中,长整型(long)数据类型被转换为了 JavaScript 中的 Number 类型,由于 JavaScript 中的 Number 类型采用的是 IEEE 754 标准的双精度浮点数表示法,使用 64 位二进制格式存储数字,其中 1 位符号位、11 位指数位和 52 位尾数位。因此,JavaScript 中的 Number 类型能够存储的有效数字位数为 52 位,即最多可以精确表示 15 位十进制数字。

Javascript Number类型范围 -9007199254740991 到 9007199254740991

C# long类型范围 -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807


3.问题解决

思路:前后端数据交互式,将Long数据转换为字符串

3.1.添加一个用于在json序列化时将long类型转换为string类型的类

1. public class LongToStringConverter : JsonConverter  

2. {  

3.     public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)  

4.     {  

5.         try  

6.         {  

7.             return reader.Value.ToString();//.ObjToLong();  

8.         }  

9.         catch (Exception ex)  

10.         {  

11.             throw ex;  

12.         }  

13.     }  

14.   

15.     public override bool CanConvert(Type objectType)  

16.     {  

17.         return true;  

18.     }  

19.   

20.     public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)  

21.     {  

22.         if (value == null)  

23.         {  

24.             writer.WriteNull();  

25.             return;  

26.         }  

27.         string sValue = value.ToString();  

28.         writer.WriteValue(sValue);  

29.     }  

30. }  


3.2.将该类添加在实体对应的属性之前

1. /// 

  

2. /// 表单类型  

3. /// 

  

4. public class FormType  

5. {  

6.     /// 

  

7.     /// 类型编号  

8.     /// 

  

9.     [JsonConverter(typeof(LongToStringConverter))]  

10.     public long TypeID { get; set; }  

11.     /// 

  

12.     /// 类型编码  

13.     /// 

  

14.     public string TypeCode { get; set; }  

15.     /// 

  

16.     /// 类型名称  

17.     /// 

  

18.     public string TypeName { get; set; }  

19.     /// 

  

20.     /// 创建时间  

21.     /// 

  

22.     public DateTime CreateTime { get; set; }  

23. }  


3.3.前端访问结果

在线客服

售前咨询

售后服务

投诉/建议

服务热线
0731-83091505
18874148081