通过 curl 使用 JSTL formatNumber 的浮点舍入错误
Floating point rounding error using JSTL formatNumber via curl
从 Oracle Commerce Platform ATG 11.2 开始,当我访问 JBOSS 服务器时,我在 Web 浏览器请求和 curl 之间得到了不同的结果——就像 formatNumber
被忽略了,值遭受浮点舍入错误。
<span itemprop="price-currency" content="USD">$</span>
<span itemprop="price" class="selection-price">
<fmt:formatNumber type="currency"
pattern="##0.00;"
value="${selectionItem.listPriceAmount}"/>
</span>
在 100% 一致性的情况下,在浏览器中点击页面将产生格式化值,例如:
- 27.99 美元
- 20.00 美元
- 10.00 美元
但是,在 Google 抓取网站时发现了一个问题,只需通过 curl
同一页面即可 100% 重现该网站。这些相同的值显示为:
- 27.990000000000002 美元
- 20.0 美元
- 10.0 美元
没有内置用户代理逻辑,只有 JSTL formatNumber
。
知道为什么通过完全相同的 JSP 的完全相同的路径会产生不同的结果吗?
fmt:formatNumber
在无法确定语言环境时会绕过 type
和 pattern
属性。这记录在 JSTL spec:
If this action fails to determine a formatting locale, it uses Number.toString()
as the output format.
请参阅 9.2 格式化区域设置部分了解如何控制区域设置分辨率。
尝试在使用 curl 时设置 header accept-language
。
从 Oracle Commerce Platform ATG 11.2 开始,当我访问 JBOSS 服务器时,我在 Web 浏览器请求和 curl 之间得到了不同的结果——就像 formatNumber
被忽略了,值遭受浮点舍入错误。
<span itemprop="price-currency" content="USD">$</span>
<span itemprop="price" class="selection-price">
<fmt:formatNumber type="currency"
pattern="##0.00;"
value="${selectionItem.listPriceAmount}"/>
</span>
在 100% 一致性的情况下,在浏览器中点击页面将产生格式化值,例如:
- 27.99 美元
- 20.00 美元
- 10.00 美元
但是,在 Google 抓取网站时发现了一个问题,只需通过 curl
同一页面即可 100% 重现该网站。这些相同的值显示为:
- 27.990000000000002 美元
- 20.0 美元
- 10.0 美元
没有内置用户代理逻辑,只有 JSTL formatNumber
。
知道为什么通过完全相同的 JSP 的完全相同的路径会产生不同的结果吗?
fmt:formatNumber
在无法确定语言环境时会绕过 type
和 pattern
属性。这记录在 JSTL spec:
If this action fails to determine a formatting locale, it uses
Number.toString()
as the output format.
请参阅 9.2 格式化区域设置部分了解如何控制区域设置分辨率。
尝试在使用 curl 时设置 header accept-language
。