将 bigdecimal 转换为 double(不带指数格式)

2024-01-10

我正在对高十进制精度 BigDecimal 对象进行计算。

我正在使用需要双精度参数的第三方库。当我尝试将其转换为 double 时,我得到指数格式的值而不是小数。

BigDecimal 0.000035000000000
Double 3.5E-5
BigDecimal bd; 
BigDecimal(0.0000349999999995631583260546904057264328002929687500);
bd= bd.setScale(15,BigDecimal.ROUND_CEILING);

Log.i("bd","bd "+bd.toPlainString());
Log.i("bd","double"+bd.doubleValue());

我找到了多种方法将此 3.5E-5 值转换为正确的小数点,但仅限字符串格式。而我需要双倍的值

在 String 对象中可以得到没有指数的结果,但在 double 中则不行

  DecimalFormat df = new DecimalFormat("#");
        df.setMaximumFractionDigits(16);
       String test=df.format(bd,doubleValue());
        System.out.println("op2 "+test);
        Double test1=Double.parseDouble(test);
        System.out.println("op2 "+test1);

输出 op2 .000035 op2 3.5E-5

自从几天以来我一直在努力寻找解决方案,因为我无法控制需要值加倍的第三方库

推荐链接

以完全精度格式化 BigDecimal(不带科学记数法) https://stackoverflow.com/questions/15834879/format-bigdecimal-without-scientific-notation-with-full-precission

将java中的指数值转换为数字格式 https://stackoverflow.com/questions/13563747/converting-exponential-value-in-java-to-a-number-format

Java中指数形式到小数的转换 https://stackoverflow.com/questions/1826065/conversion-from-exponential-form-to-decimal-in-java

如何解决 Java 舍入双精度问题 https://stackoverflow.com/questions/179427/how-to-resolve-a-java-rounding-double-issue

Java BigDecimal 不带 E https://stackoverflow.com/questions/12026610/java-bigdecimal-without-e

如何避免 Double 中的科学记数法? https://stackoverflow.com/questions/20813631/how-to-avoid-scientific-notation-in-double

我的问题与这些链接不同,我不希望双精度作为没有指数的字符串,而是只想要双精度格式。

EDIT

如果传递的 double 值是指数格式,基于 NDK 的库将进一步对该对象进行计算,这将导致更多的小数点和更大的指数值。所以,我想传递一个没有 E 的简单双精度


你似乎很困惑double,一个 64 位值,其中不同的位具有不同的含义,及其字符串表示形式。

我们取一个值0.015625。在内部,双精度数表示为 64 位(我现在不知道是哪种位组合,但这无论如何都是无关紧要的)。

但字符串表示形式取决于您正在使用的库的格式设置。请注意,这些表示0.015625 and 1.5625E-2表示完全相同的双精度值。 double 不存储为字符串,它不包含. or an E,只是一些位。这些位的组合形成了它的实际值,并且无论您如何将其表示为字符串,它都是相同的。如果您有不同的格式设置,结果也可以是1.56E-2。这只是意味着转换内部位组合的代码double对字符串进行一些舍入。

所以,要获得一个double from a BigDecimal,只需使用bd.doubleValue()。不需要使用中间字符串表示形式,这样做甚至可能是有害的,因为如果字符串表示形式执行一些舍入,您将无法获得中间值的最佳近似值BigDecimal.

再说一次,bd.doubleValue()是执行此操作的唯一正确方法。这不会返回特定的格式,它只是返回double最接近该值的BigDecimal.

再次强调,不要混淆double类型及其表示为字符串的方式。这些是不同的事情。 Adouble is a double is a double,并且它不存储为字符串,指数或普通或四舍五入或其他任何形式。

实际上,BigDecimal.toString() and BigDecimal.toPlainString()还返回相同的不同字符串表示形式BigDecimal。 AFAIK,甚至还有第三个字符串转换函数,toEngineeringString(),这为您提供了相同的另一个字符串表示形式BigDecimal。这类似于double:具有不同参数的不同输出例程对于完全相同的值返回不同的字符串。

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

将 bigdecimal 转换为 double(不带指数格式) 的相关文章

  • 路径中 File.separator 和斜杠之间的区别

    使用有什么区别File separator和一个正常的 在 Java 路径字符串中 与双反斜杠相反 平台独立性似乎不是原因 因为两个版本都可以在 Windows 和 Unix 下运行 public class SlashTest Test
  • Spring @RequestMapping 带有可选参数

    我的控制器在请求映射中存在可选参数的问题 请查看下面的控制器 GetMapping produces MediaType APPLICATION JSON VALUE public ResponseEntity
  • 十进制到八进制的转换[重复]

    这个问题在这里已经有答案了 可能的重复 十进制转换错误 https stackoverflow com questions 13142977 decimal conversion error 我正在为一个类编写一个程序 并且在计算如何将八进
  • 从 127.0.0.1 到 2130706433,然后再返回

    使用标准 Java 库 从 IPV4 地址的点分字符串表示形式获取的最快方法是什么 127 0 0 1 到等效的整数表示 2130706433 相应地 反转所述操作的最快方法是什么 从整数开始2130706433到字符串表示形式 127 0
  • Java按日期升序对列表对象进行排序[重复]

    这个问题在这里已经有答案了 我想按一个参数对对象列表进行排序 其日期格式为 YYYY MM DD HH mm 按升序排列 我找不到正确的解决方案 在 python 中使用 lambda 很容易对其进行排序 但在 Java 中我遇到了问题 f
  • 尝试在 ubuntu 中编译 android 内核时出错

    我正在尝试从源代码编译 Android 内核 并且我已经下载了所有正确的软件包来执行此操作 但由于某种原因我收到此错误 arm linux androideabi gcc error unrecognized command line op
  • 在 android DatePickerDialog 中将语言设置为法语

    有什么办法可以让日期显示在DatePickerDialog用法语 我已经搜索过这个但没有找到结果 这是我的代码 Calendar c Calendar getInstance picker new DatePickerDialog Paym
  • 使用Caliper时如何指定命令行?

    我发现 Google 的微型基准测试项目 Caliper 非常有趣 但文档仍然 除了一些示例 完全不存在 我有两种不同的情况 需要影响 JVM Caliper 启动的命令行 我需要设置一些固定 最好在几个固定值之间交替 D 参数 我需要指定
  • Google App Engine 如何预编译 Java?

    App Engine 对应用程序的 Java 字节码使用 预编译 过程 以增强应用程序在 Java 运行时环境中的性能 预编译代码的功能与原始字节码相同 有没有详细的信息这是做什么的 我在一个中找到了这个谷歌群组消息 http groups
  • 如何从终端运行处理应用程序

    我目前正在使用加工 http processing org对于一个小项目 但是我不喜欢它附带的文本编辑器 我使用 vim 编写所有代码 我找到了 pde 文件的位置 并且我一直在从 vim 中编辑它们 然后重新打开它们并运行它们 重新加载脚
  • Java列表的线程安全

    我有一个列表 它将在线程安全上下文或非线程安全上下文中使用 究竟会是哪一个 无法提前确定 在这种特殊情况下 每当列表进入非线程安全上下文时 我都会使用它来包装它 Collections synchronizedList 但如果不进入非线程安
  • 玩!框架:运行“h2-browser”可以运行,但网页不可用

    当我运行命令时activator h2 browser它会使用以下 url 打开浏览器 192 168 1 17 8082 但我得到 使用 Chrome 此网页无法使用 奇怪的是它以前确实有效 从那时起我唯一改变的是JAVA OPTS以启用
  • 声明的包“”与预期的包不匹配

    我可以编译并运行我的代码 但 VSCode 中始终显示错误 早些时候有一个弹出窗口 我不记得是什么了 我点击了 全局应用 从那以后一直是这样 Output is there but so is the error The declared
  • Android:膨胀布局时出现 StackOverFlowError 和 InvokingTargetException

    首先 对不起我的英语 我在膨胀布局时有一个问题 我有一个自定义视图 从 LinearLayout 扩展而来 称为按钮帮助 我在名为的布局上使用该视图加载活动 我的以下代码在所有设备和模拟器上都能完美运行 但具有 QVGA 屏幕 例如 Sam
  • 一次显示两条Toast消息?

    我希望在一个位置显示一条 Toast 消息 并在另一位置同时显示另一条 Toast 消息 多个 Toast 消息似乎总是按顺序排队和显示 是否可以同时显示两条消息 是否有一种解决方法至少可以提供这种外观并且不涉及扰乱活动布局 Edit 看来
  • 实现滚动选择 ListView 中的项目

    我想使用 ListView 您可以在其中滚动列表来选择一个项目 它应该像一个 Seekbar 但拇指应该是固定的 并且您必须使用该栏来调整它 我面临的一个问题是 我不知道这种小部件是如何调用的 这使得我很难搜索 所以我制作了下面这张图片 以
  • 将两个文本视图并排放置在布局中

    我有两个文本视图 需要在布局中并排放置 并且必须遵守两条规则 Textview2 始终需要完整显示 如果布局中没有足够的空间 则必须裁剪 Textview1 例子 文本视图1 文本视图2 Teeeeeeeeeeeeeeeeeextview1
  • android sdk 的位置尚未在 Windows 操作系统的首选项中设置

    在 Eclipse 上 我转到 windows gt Android SDK 和 AVD Manager 然后弹出此消息 Android sdk 的位置尚未在首选项中设置 进入首选项 在侧边栏找到 Android 然后会出现一个 SDK 位
  • java.lang.IllegalStateException:驱动程序可执行文件的路径必须由 webdriver.chrome.driver 系统属性设置 - Similiar 不回答

    尝试学习 Selenium 我打开了类似的问题 但似乎没有任何帮助 我的代码 package seleniumPractice import org openqa selenium WebDriver import org openqa s
  • Spring Boot @ConfigurationProperties 不从环境中检索属性

    我正在使用 Spring Boot 1 2 1 并尝试创建一个 ConfigurationProperties带有验证的bean 如下所示 package com sampleapp import java net URL import j

随机推荐