为什么要使用 JSON 中的字符串来表示十进制数

2024-01-25

一些 API,例如贝宝API https://developer.paypal.com/docs/api/payments/v2/#definition-money使用 JSON 中的字符串类型来表示十进制数。所以"7.47"代替7.47.

为什么/什么时候这是使用 json 数字值类型的好主意? AFAIK 数值类型允许无限精度和科学记数法。


将 JSON 中的数值作为字符串传输的主要原因是为了消除传输过程中的任何精度损失或歧义。

确实,JSON 规范没有指定数值的精度。这并不意味着 JSON 数字具有无限精度。这意味着未指定数字精度,这意味着 JSON 实现可以自由选择对其实现或目标方便的任何数字精度。如果您的应用有特定的精度要求,这种可变性可能会带来麻烦。

精度损失通常在数值的 JSON 编码中并不明显(1.7 很好且简洁),但在接收端的 JSON 解析和中间表示中表现出来。 JSON 解析函数可以相当合理地将 1.7 解析为 IEEE 双精度浮点数。然而,有限长度/有限精度十进制表示总是会遇到其十进制扩展不能表示为有限数字序列的数字:

  1. 无理数(如 pi 和 e)

  2. 1.7 在基数 10 表示法中具有有限表示,但在二进制(基数 2)表示法中,1.7 无法精确编码。即使有接近无限数量的二进制数字,您也只能接近 1.7,但永远无法精确地达到 1.7。

因此,将 1.7 解析为内存中的浮点数,然后打印该数字可能会返回类似 1.69 的值,而不是 1.7。

JSON 1.7 值的使用者可以使用更复杂的技术来解析值并将其保留在内存中,例如使用定点数据类型或任意精度的“string int”数据类型,但这并不能完全消除某些数字的转换精度损失。事实上,很少有 JSON 解析器会采用这种极端的措施,因为大多数情况下的好处很低,而且内存和 CPU 成本很高。

因此,如果您想向消费者发送精确的数值,并且不希望将该值自动转换为典型的内部数字表示形式,那么最好的选择是将数值作为字符串发送出去,并准确地告诉消费者如果需要对字符串执行数字运算,则应如何处理该字符串。

例如:在一些 JSON 生成器(JRuby 等)中,BigInteger 值会自动以字符串形式输出到 JSON,这主要是因为 BigInteger 的范围和精度比 IEEE 双精度浮点数大得多。将 BigInteger 值减少为双倍以便作为 JSON 数字输出通常会丢失有效数字。

另外,JSON 规范 (http://www.json.org/ http://www.json.org/) 明确指出 NaN 和无穷大 (INF) 对于 JSON 数值无效。如果需要表达这些边缘元素,就不能使用JSON数字。您必须使用字符串或对象结构。

最后,还有另一个方面可能导致选择将数字数据作为字符串发送:显示格式的控制。前导零和尾随零对于数值来说无关紧要。如果发送 JSON 数值 2.10 或 004,转换为内部数字形式后,它们将显示为 2.1 和 4。

如果您发送的数据将直接显示给用户,您可能希望您的金钱数字在屏幕上很好地排列,小数点对齐。一种方法是让客户端负责格式化数据以供显示。另一种方法是让服务器格式化数据以供显示。对于客户端来说,在屏幕上显示内容可能更简单,但是如果客户端还需要对值进行计算,这可能会使从字符串中提取数值变得困难。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么要使用 JSON 中的字符串来表示十进制数 的相关文章

  • 是什么导致我的 PayPal IPN 脚本失败?

    我从 PayPal IPN 脚本收到以下信息 从以下内容是否可以看出导致 IPN 交易失败的原因 如果不是 我该如何进一步调查问题 01 25 2010 7 49 PM FAIL IPN Validation Failed IPN POST
  • 如何使用 JSON.net 处理同一属性的单个项目和数组

    我正在尝试修复我的 SendGridPlus 库以处理 SendGrid 事件 但我在 API 中对类别的处理不一致方面遇到了一些麻烦 在以下示例中 有效负载取自SendGrid API 参考 http sendgrid com docs
  • UNWIND 从 JSON 文件加载的多个不相关的数组

    我试图通过一次调用 apoc load json 来展开多个数组属性 我的版本不能完全工作 某些关系无法加载 我的猜测是 这是由于通过WITH 命令进行输出管道造成的 如果我为每个基于数组的属性单独运行展开 我可以加载所有内容 但我很好奇如
  • 如何使用 RSpec 检查 JSON 响应?

    我的控制器中有以下代码 format json render json gt flashcard gt flashcard lesson gt lesson success gt true 在我的 RSpec 控制器测试中 我想验证特定场景
  • JSON 解析器从大型 JSON 文件中逐条读取

    我有一个巨大的 JSON 文件 1GB 它基本上是以下格式的对象数组 x y p q x1 y1 p1 q1 我想解析这个文件 这样所有的数据都不会加载到内存中 基本上我想获取例如 数组中的前 1000 个对象进行内存处理 然后将接下来的
  • 在 JavaScript 中按属性过滤 JSON 数据

    我有一个 JSON 序列化集合 id person1 date 7 20 2014 17 20 09 listed name Tom name Tom contact info email protected cdn cgi l email
  • JSON 为 foreach() 提供的参数无效

    我在从 JSON 检索数据时遇到一些问题 它总是说为 foreach 提供的参数无效 这是 url php 中的 JSON nama IT SERVICE SOLUTION nilai 0 periode 11 tahun 2014 nam
  • 如何在phonegap应用程序中使用存储在localStorage中的json feed?

    这就是我正在做的 向我的网络服务器发出请求 响应采用 json 格式 使用 jquery 模板在我的应用程序中呈现回调数据 非常简单 就像魅力一样 问题是 我想在本地存储一些数据 这样我的应用程序就不必每次都从服务器获取它 3g 很慢 每笔
  • 编码的 nsdata utf8 json,在 ios 中带有重音字符

    我向网络服务器发出一个发布请求 该服务器用 JSON 回答我 这是响应的标头 Cache Control private Content Length 826 Content Type application json charset ut
  • 在 json 中解析尾随字符

    我正在尝试检查 json 是否有效 并且我遇到了奇怪的行为 当我将一些字符附加到可解析的 json 时 jackson 和 gson 都会解析它 并且它们会忽略尾随字符 我想检查 json 是否严格有效 请帮忙 我尝试了几个标志mapper
  • PHP 中的 MongoDB - 如何将项目插入集合中的数组中?

    这必须很容易 但我似乎无法弄清楚 假设我有一个集合users这是集合中的第一项 id ObjectId 4d8653c027d02a6437bc89ca name Oscar Godson email email protected cdn
  • 如何修复“没有这样的文件或目录,lstat 'scss/'”?

    我正在尝试遵循 youtube 上的简单教程他尝试使用终端运行 npm 脚本 sass 文件 当我执行命令时npm 运行 sass显示错误消息错误 ENOENT 没有这样的文件或目录 lstat scss 我认为问题在于文件的路径或文件的权
  • 在 HBase 中存储和检索字符串数组

    我读过这个答案 如何将复杂对象存储到hadoop Hbase中 https stackoverflow com questions 4086684 how to store complex objects into hadoop hbase
  • 使用 JSON 参数的 Postgres 批量 INSERT 函数

    这是一个plpgsqlpostgres 的函数9 6 它试图INSERT一行 如果插入没有失败 由于违反键约束 那么它会运行更多命令 CREATE FUNCTION foo int text text RETURNS void AS BEG
  • C# xml序列化必填字段

    我需要将一些字段标记为需要写入 XML 文件 但没有成功 我有一个包含约 30 个属性的配置类 这就是为什么我不能像这样封装所有属性 public string SomeProp get return someProp set if som
  • 如何将单引号转义为双引号转义为单引号

    以下是符合此描述的命令行示例 curl http dumbdomain com solr collection2 update json H Content type application json d add doc uid 79729
  • Azure 数据工厂 - 从 Data Lake Gen 2 JSON 文件中提取信息

    我有一个 ADF 管道 将原始日志数据作为 JSON 文件加载到 Data Lake Gen 2 容器中 我们现在想要从这些 JSON 文件中提取信息 我正在尝试找到从所述文件中获取信息的最佳方法 我发现 Azure Data Lake A
  • jQuery:处理 getJSON() 中的错误?

    使用 jQuery 时如何处理 500 错误getJSON http api jquery com jQuery getJSON 有几个关于错误处理的问题getJSON and https stackoverflow com questio
  • 使用 x509 证书签署 json 文档或字符串

    如何使用 x509 证书签署 json 文档或字符串 public static void fund string filePath C Users VIKAS Desktop Data xml Read the file XmlDocum
  • 将 List 转换为 JSON

    Hi guys 有人可以帮助我 如何将我的 HQL 查询结果转换为带有对象列表的 JSON 并通过休息服务获取它 这是我的服务方法 它返回查询结果列表 Override public List

随机推荐