【问题标题】:Converting BigDecimal to double value将 BigDecimal 转换为双精度值
【发布时间】:2019-02-24 07:05:44
【问题描述】:

我想问如何将我的所有字符串转换为指数加倍。 当我使用长度超过七的字符串时,它做得很好。

new BigDecimal("12345678").doubleValue() => 1.2345678E7

但七岁及以下我无法导出指数数。

new BigDecimal("1234567").doubleValue() => 1234567.0

我想要的是 1.234567E6。

有没有办法做到这一点?找了好久,一无所获。

问题是我返回的类型必须是 double 。将值转换为七以下后,我只能得到没有指数的值。

double test = new BigDecimal("1.234567E6").doubleValue() ;//output 1234567.0 

但我需要它是 1.234567E6 并返回给调用者。这不可能吗?

【问题讨论】:

  • 什么意思?那只是格式化。 double 值不关心变成字符串时如何打印!
  • 数字 1.2345678E7 与 12345678.0 相同。请注意,指数只是输出例程放在那里的东西(超过一定数量的有效数字,使用指数形式)。不管怎么显示,都是同一个数字。
  • @NathanHughes:如果需要双精度,doubleValue() 是正确的例程。 OP 说:“问题是我返回的类型必须是双精度的”。如果需要,双打也可以采用不同的格式。

标签: java double bigdecimal


【解决方案1】:

您应该知道1.2345678e712345678.0完全相同相同的值,只是具有不同的文本表示。您也可以将1234567.0 表示为1.234567e6。也完全相同的双重,只是写出来的方式不同。

默认输出以指数格式(“e-form”)显示具有超过一定数量有效数字的值,否则为纯十进制格式。

因此,您可能希望更改收到的双打的格式。这可以通过例如来完成DecimalFormatString.format() 或类似名称。这不会改变双打,只会改变它们在字符串中的呈现方式。

【讨论】:

    【解决方案2】:

    对于您的问题,您想将值转换为具有指数的BigDecimal,您可以使用DecimalFormat。您还可以更改输出值数字的比例。

    import java.math.*;
    import java.text.*;
    public class HelloWorld{
    
         public static void main(String []args){
            double a = new BigDecimal("1234567").doubleValue();
            String b;
            System.out.println(a);
    
            NumberFormat formatter = new DecimalFormat("0.0E0");
            formatter.setRoundingMode(RoundingMode.DOWN);
            formatter.setMinimumFractionDigits(5); //<---Scale
            b = formatter.format(a);
    
            System.out.println(b);
         }
    }
    

    输出如下:

    1234567.0 //Unformatted Value
    1.23456E6 //Formatted Value
    

    【讨论】:

    • OP 写道:“问题是我的类型 return 必须是双精度的”(强调我的)。那么为什么intValue()?我宁愿解释指数或普通,它们保持相同的值,只是文本表示不同。
    • @RudyVelthuis 感谢您提醒我数据类型,尽管它是 int 还是 double 都没有关系,DecimalFormatter 仍然可以正常工作。
    【解决方案3】:

    请参阅java.text.DecimalFormat 中关于科学记数法的部分。

    例如,

        DecimalFormat scientificFormat = new DecimalFormat("0.###E0");
        System.out.println(scientificFormat.format(BigDecimal.valueOf(123456L)));
        System.out.println(scientificFormat.format(BigDecimal.valueOf(1234567L)));
    
        scientificFormat.setMinimumFractionDigits(10);
        System.out.println(scientificFormat.format(BigDecimal.valueOf(12345678L)));
    

    会给你

    1,235E5
    1,235E6
    1,2345678000E7
    

    更改模式以匹配您要查找的内容。

    【讨论】:

      猜你喜欢
      • 2012-09-05
      • 2021-09-12
      • 2011-01-14
      • 2017-02-24
      • 2015-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-16
      相关资源
      最近更新 更多