我如何获得双精度数的前 5 个数字

How can I get the first 5 numbers of a double

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

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

我尝试过不同的方法,例如将数字乘以 10 和 x 的幂 但是x好像只影响小数位,设置为x位小数

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

定义一些输入。

double[] doubles = { 12345.6789 , 1.23456789 , 0.123456789 } ;

循环那些输入。对于每一个,生成一个字符串。如果找到句号,则取前 六个 个字符。如果没有,五个。如果句号位于最后一个位置,例如在我们的第一个示例输入中,则删除。

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 ) ;
}

看到这个code run live at IdeOne.com

12345
1.2345
0.1234

警告:您可能需要通过将逗号 (,) 作为 decimal separator 而不是句号 (.) 字符来实现国际化。

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

这是一种方法。

  • 转换为字符串。
  • 检查小数。
  • 如果不存在 (= -1) 或 >= 5,将 i 设置为 5。否则设置为 6
  • 然后获取从0到i的子串。
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

使用BigDecimal

  • 将小数点移动到right/left,直到小数点前只有所需的(有效)位数;
  • 将小数位数设置为零,即删除小数点后的所有数字或将精度扩展到小数点(如果缺少数字);
  • 将小数点移回原来的位置,撤消第一步。
static BigDecimal convert(BigDecimal number, int significant) {
    var beforeDecimal = number.precision() - number.scale();
    var movePoint = significant - beforeDecimal;
    return number
           .movePointRight(movePoint)
           .setScale(0, RoundingMode.DOWN)
           .movePointLeft(movePoint);
}

叫得像
convert(BigDecimal.valueOf(1.23456789), 5)

convert(new BigDecimal("1.23456789"), 5)

到return BigDecimal:
1.2345

我最终选择了以下内容:

//cuts the string to the first 6 letters
String sixLetter = aDouble.toString().substring(0,6);

//checks if there is a "." before the 5th character so we don't end up with 12345.
if (sixLetter.indexOf(".") > 4) {
//then assuming there is not a "." it will cut it to the first 5 characters

    return sixLetter.substring(0,5);
//if there is a "." (other than 12345.) it will cut it down to 5 characters resulting in 12345
};
return sixLetter;