java - 使用 DecimalFormat 格式化 Double 以在没有科学记数法的情况下打印

标签 java android string-formatting floating-accuracy double-precision

我一直在从传感器读数中读取时间戳值,但由于它们是以纳秒为单位提供的,所以我想我应该将它们转换为两倍并进行转换。结果数字是一个 17 位数字值,加上分隔符。

尝试直接打印它会产生科学记数法,这是我不想要的,所以我使用 DecimalFormat 类将其输出为 4 位小数的预期值。问题是,即使调试器显示了 17 个十进制数字,即使在“doubleValue()”调用之后,输出字符串也显示了 15 个数字。

代码:

...
Double timestamp = (new Date().getTime()) +       // Example: 1.3552299670232847E12
            ((event.timestamp - System.nanoTime()) / 1000000D);
DecimalFormat dfmt = new DecimalFormat("#.####");

switch(event.sensor.getType()){
    case Sensor.TYPE_LINEAR_ACCELERATION:
    case Sensor.TYPE_ACCELEROMETER:
        accel = event.values.clone();
        String line = "A" + LOGSEPARATOR +              
            dfmt.format(timestamp.doubleValue()) + // Prints: 1355229967023.28
...

我认为这可能是 android 精度问题,但调试器的格式化程序也显示了错误的精度。我已经在本地 java 程序中对此进行了测试,并且两个调用具有相同数量的数字。

这是 DecimalFormat 错误/限制吗?还是我做错了什么?

最佳答案

Java 中的 double 只有 52 位的尾数(将隐藏的 1 计算为 53 位)。这相当于 15-16 位小数 (53*log10(2))。这之后的每个数字都是随机的,因此转换函数将输出截断到小数点后 15 位是有意义的。

既然您不需要 double 提供的大数字范围,为什么不保留该值那么长呢?这将为您提供 63 个有效位(符号为 64 -1)。

关于java - 使用 DecimalFormat 格式化 Double 以在没有科学记数法的情况下打印,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13842696/

相关文章:

java - 字符串对齐

java - 如何删除 Eclipse 中的默认检查样式?

java - 布局管理器在 JComponent 之上添加 (GUI) 控件

Android - Activity 与 ListActivity - 我的 Activity 类应该扩展哪一个?

c# - Xamarin.Android中如何获取AlarmManager系统服务

java - 当没有空格时,在 strings.xml 中使用带有格式参数的符号字符

java - 如何按 ":"对齐多行 JOptionPane 输出对话框消息?

java - 进度对话框阻塞

java - Java 数学类的 native 代码

android - 我的 Android 应用程序中带有关闭按钮的 Facebook 登录对话框空白屏幕?