当前位置: 首页 > 面试题库 >

Json.NET以最小的小数位序列化float / double,即没有多余的“ .0”吗?

薛泰
2023-03-14
问题内容

当序列化浮点数和双精度数时,如果数字不包含任何小数部分,Json.NET总是在末尾添加“
.0”。我想知道是否有一种简单的方法可以绕过此方法,从而获得更紧凑的表示形式?序列化包含许多数字的对象时,多余的句点和零加起来。

例如,运行此代码时:

JsonConvert.SerializeObject(1.0);

我期望(并想要)这个结果:

"1"

但是我得到了:

"1.0"

我查看了源代码,发现它是在提交0319263中故意添加的(
“ …- Fixed JsonConvert总是写一个带小数点的浮点数…” ),它运行的代码基本上类似于:

    private static string EnsureDecimalPlace(double value, string text)
    {
        if (double.IsNaN(value) || double.IsInfinity(value) ||
            text.IndexOf('.') != -1 || text.IndexOf('E') != -1 ||
            text.IndexOf('e') != -1)
        {
            return text;
        }

        return text + ".0";
    }

因此,我想知道:

  1. 发生这种变化的原因可能是什么?的JSON规范似乎并不需要它。

  2. 有没有简单的方法可以绕过它?


问题答案:

1.发生这种变化的原因可能是什么?

规范不要求它,但也不禁止它。

我的猜测是,它允许对Json.NET进行更好的类型检查(如果它们在某处),或者这是“以防万一”的事情,它可以区分整数和浮点类型。

来自Json.org

2.有没有简单的方法可以绕过它?

并不是那么容易,但是如果您真的想要的话,可以将其更改EnsureDecimalPlace()为简单地重新html" target="_blank">编译自己的Json.NET版本。return text;



 类似资料:
  • 主要内容:小数的输出,数字的后缀,小数和整数相互赋值小数分为整数部分和小数部分,它们由点号 分隔,例如 0.0、75.0、4.023、0.27、-937.198 -0.27 等都是合法的小数,这是最常见的小数形式,我们将它称为 十进制形式。 此外,小数也可以采用 指数形式,例如 7.25×10 2、0.0368×10 5、100.22×10 -2、-27.36×10 -3 等。任何小数都可以用指数形式来表示。 C语言同时支持以上两种形式的小数。但是

  • 我有一个BigDecimal数字,我只考虑它的2个小数点,所以我用以下方法截断它: 我尝试使用格式化程序Formatter.format但我总是得到2个小数位数。 我怎么能这么做?也许正在处理bd.toPlainString()中的字符串?

  • 我正在使用。Net Web API返回具有双精度的信息。在返回之前,我将这些双精度整数四舍五入到小数点后两位。当我打印它们时,我得到(f.e):145,92。一切都很好。但是当我返回这个双精度时,我的JSON响应是用这样的双精度创建的: “小时”:145.92000000000002 你知道是什么造成了这个问题吗? 我的舍入函数是: 谢啦

  • 我一直在努力解决Euler项目中的第5个问题,这就像 2520是可以被1到10中的每一个数字除以而没有任何余数的最小数字。 可以被1到20的所有数字整除的最小正数是多少? 我决定更进一步,我决定找到一个最小的正数,它可以被从1到limit的所有数字平均整除,limit是用户定义的。 当我执行程序时,问题开始出现,它立即打印出0。我试图追踪我的代码,但没有成功。

  • 问题内容: 当我使用json.net将小数写到json时,我变得很烦人。有时是1 dp,其他时候是2。 显然,我知道将小数输出到具有一定数量的小数(例如this)的字符串的解决方案,但是我猜想如果没有编写自定义的序列化程序,就无法使用json.net进行控制。 我也知道要强制使用 最大 小数位数,这个问题与强制执行最小小数位数有关。 前两个测试表明发生了什么,它保持声明或计算中的原始小数位数。 我

  • 问题内容: 我正在处理应用程序中的许多双精度值,是否有任何简单的方法来处理Java中十进制值的格式? 还有其他比这更好的方法了吗 我基本上想做的是格式化double值,例如 问题答案: 实际上,你的模式有错误。你想要的是: 注意,恰好是两个小数位。 如果你使用(表示“可选”数字),它将删除尾随的零-即 ;仅打印,而不是。