当前位置: 首页 > 知识库问答 >
问题:

我怎么才能得到双倍的前5个数字

束福
2023-03-14

我怎么可能只有前5个数字?

12345.6789 --> 12345
1.23456789 --> 1.2345
0.123456789 --> 0.1234

我尝试过不同的方法,比如把数字乘以10和x的幂,但是x似乎只影响小数点,设置为x小数点

共有3个答案

陈寒
2023-03-14

使用BigDecimal

static BigDecimal convert(BigDecimal number, int significant) {
    var move = significant - number.precision() + number.scale();
    return number
           .movePointRight(move)
           .setScale(0, RoundingMode.DOWN)
           .movePointLeft(move);
}

类似于
转换(BigDecimal.valueOf(1.23456789),5)

转换(新的BigDecimal(“1.23456789”),5)

返回BigDecimal:
1.2345

司空默
2023-03-14

这里有一个办法。

  • 转换为字符串。
  • 检查小数
  • 如果不存在(=-1)或
double[] v = {12345.6789,
1.23456789,
0.123456789};

for (double d : v) {
    String s = Double.toString(d);
    int i = s.indexOf('.');
    i = i < 0 || i >= 5 ? 5 : 6;
    System.out.println(s.substring(0,i));
}

印刷品

12345
1.2345
0.1234
宋健柏
2023-03-14

正如其他人评论的那样,一种方法是使用字符串操作。可能看起来不优雅,但它完成了任务。

定义一些输入。

List<Double> doubles = 
    List.of(
        12345.6789 ,
        1.23456789 ,
        0.123456789 
    )
;

循环这些输入。对于每个输入,生成一个字符串。如果找到了FULL STOP,请取前六个字符。如果没有,请取五个。如果FULL STOP落在最后一位,例如在我们的第一个示例输入中,请删除。

for( Double d : doubles )
{
    String s = String.valueOf( d ) ; 
    String s5 = s.substring( 0 , s.contains( "." ) ? 6 : 5 ) ;
    if( s5.endsWith( "." ) ) { s5 = s5.substring( 0 , s5.length() - 1 ) ; }  // Drop FULL STOP in last place.
    System.out.println( s5 ) ;
}

查看此代码在IdeOne上的实时运行。通用域名格式。

12345
1.2345
0.1234

注意:您可能需要将逗号()作为十进制分隔符,而不是句号()字符,从而实现国际化。

String s5 = s.substring( 0 , ( s.contains( "." ) || s.contains( "," ) ) ? 6 : 5 ) ;
 类似资料: