【问题标题】:GWT - Double to Long results in wrong numberGWT - Double to Long 导致错误的数字
【发布时间】:2014-10-19 12:24:15
【问题描述】:

我不确定这是否是一个错误,如果我只是达到了 GWT 的限制,或者我只是愚蠢地创建了如此高数量的双精度数。

在客户端执行以下操作时:

Double d = 10152826455075087d;
GWT.log("Value is now: " + d.toString());

这将打印数字:10152826455075088

这是从 facebook 和 atm 检索到的 ID,我将其存储为 Long,但如果这是一个限制,我必须开始将我的 ID 存储为字符串。

有人可以确认这是错误还是限制?另外,如果是错误,我应该在哪里报告?

谢谢!

【问题讨论】:

    标签: java json google-app-engine gwt


    【解决方案1】:

    这个数字太大了,双精度浮点数的 epsilon 比 1 高。Epsilon 描述了当前数字与下一个可能数字之间的距离。

    在浏览器的控制台中试试这个:

    console.log(10152826455075087);
    

    它将打印 10152826455075088。JavaScript 将所有数字存储为双精度浮点数。

    【讨论】:

    • 感谢您的确认!我认为 GWT 在幕后做了一些魔术,将双精度数存储为包含前半部分和后半部分的数组,以便可以转换为 Long? ://
    • 不要担心将 ID 作为字符串存储在客户端,因为您不会将该 ID 用于数学运算。您不会尝试将两个 ID 相加、相减或相乘,因此对您而言,它们就是:ID,就像电话号码一样。
    • 我不担心使用 String 作为 ID,使用 Long 更方便,因为我所有的实体都有 Long id(使用 Objectify 和 String 不会自动生成 id),但我会将来存储 facebook-id 时使用 String。谢谢!
    • 请注意,这与 Java 中的行为完全相同 - 数据过多的 double 将失去精度。如果您希望某物成为 Long,请在任何地方将其称为 Long。 GWT 可以正确模拟 Long。
    • 感谢您澄清科林!我觉得奇怪的是,作为核心 GWT 包的一部分的 JSONNumber 类不能真正处理大的 Long,因为它将任何数字存储为双精度数。这应该是应该在问题报告中提出的内容,还是他们已经知道并忽略的内容?
    猜你喜欢
    • 2012-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-19
    • 2017-11-29
    相关资源
    最近更新 更多