【发布时间】:2015-04-25 06:08:18
【问题描述】:
我正在使用 NewtonSoft 的 JSON.NET 程序集在 C# 控制台应用程序中加载 .json 文件。我想我已经完成了大部分工作,除了我发现一些负浮点值正在四舍五入。
这里是相关代码;如您所见,我尝试了load 和parse 两种方法,但结果相同。
string content;
using (StreamReader reader = new StreamReader("C:\\[Path]\brackett_full_room.json"))
{
content = reader.ReadToEnd();
}
//// JObject rss = JObject.Load(reader);
JObject rss = JObject.Parse(content);
原来的值是这样的:
"geometry" : { "rings" : [ [ [ -9221300.3411999997, 4120326.8838 ],
[ -9221300.2146000005, 4120327.992399998 ]...
但是-9221300.3411999997 在rss 变量中变成类似于-9221300.3412 的东西,这导致坐标不起作用;长正值很好。
有没有办法保持足够高的精度(即,如果解析为double 而不是float,则应该有足够的数字)?
【问题讨论】:
-
而不是解析为 JObject(在这种情况下可能使用不正确的类型,不知道正在选择哪个),而是创建一些与正确类型匹配的 json 对象树的类(不确定是 double 还是 float或十进制在这种情况下,可能是十进制?)并反序列化为?
-
谢谢。如果发生这种情况,那么我将不得不加载 JObject 以外的东西,甚至可能在 JSON.NET 程序集之外完成大部分工作?
-
您的问题是双浮点数缺乏精度。这不是 JSON.net 的问题,而是 double 类型的问题。
-
json.net 对用于存储值的类型做出了错误的决定。便便。解决方案是通过创建对象图来告诉它。只需创建类型并使用 json.net 进行反序列化。巴姆。没有问题。去吧,去做吧。
-
@Meengla:听起来你真的有比四舍五入更大的问题。如果您的代码在比较浮点数时依赖于该级别的精度,您可能应该修复 SQL 查询。在最好的情况下,比较浮点数是否相等通常是一个冒险的命题。