从double到long的转换不正确

时间:2017-06-26 13:28:13

标签: java android long-integer type-conversion epoch

我有以下代码:

Double.valueOf(defaultValue.toString()).longValue()

我使用此行来解析为Android创建的TimePicker defaultValue。我将此默认值(在我的PreferenceScreen xml中)设置为1483318800000。出于某种原因,它以科学记数法开始:1.48331876E12然后在完成上面的代码之后:1483318760000。它结束了。我需要它是正确的,因为这是一个以毫秒为单位的时间戳。我在晚上8点拍摄 - 但是我只能在下午7:59拍摄(因为在转换之后,它已经关闭了)。

如果我Long.parseLong(defaultValue.toString()),那么我会得到一个NumberFormatException,因为它是科学记数法。

我如何保证"良好" 转换?

修改:转换代码是我在上面显示的第一行代码。我像这样设置默认值:

    <TimePreference
            android:defaultValue="1483318830000"
            android:key="settings_night_mode_start_time"
            android:title="@string/settings_night_mode_start" />

然后它被传递到this function

2 个答案:

答案 0 :(得分:3)

在代码之前的某个地方,此值已经转换为Float(不是Double),然后又转换为字符串。

System.out.println(Float.valueOf("1483318800000"));

1.48331876E12

答案 1 :(得分:1)

感谢@ rustot的回答,我发现了there is an issue with Preferences in Android regarding parsing the default values.

修复方法是使用字符串资源设置默认值,而不是我给它的long值。

<string name="settings_night_mode_default_start_time" translatable="false">1483318830000</string>

    <TimePreference
            android:defaultValue="@string/settings_night_mode_default_start_time"
            android:key="settings_night_mode_start_time"
            android:title="@string/settings_night_mode_start" />

这可以按预期工作。 :)