我如何获得双精度数的前 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;
我怎么能只有前 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;