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.前端访问结果