将数字格式化为另一个数字的格式

时间:2015-11-25 10:24:26

标签: java number-formatting

有没有办法使用Java的标准库将数字格式化为另一个数字的格式?

假设我有一个号码double a = 3.03

我是否可以使用数字a作为格式化模型,以便通过执行类似double b = 56.0934143

的操作,将数字"56.09"格式化为字符串formatNumber(b, a)

4 个答案:

答案 0 :(得分:3)

在某种意义上你所要求的是可能的,但可能会变得棘手......

挑战源于如何表示浮点数。见this discussion。查看浮点数,很难确定用户想要的基数10中的位数。

例如,如果您使用单个精度浮点数表示3.03并转换回基数10,则会得到更接近3.029999971389771的值。这是因为3.03无法在基数2中完美呈现。

所以你需要一些复杂的逻辑来弄清楚如果一个浮点数是3.029999971389771,那么用户可能想要一个两位小数位3.03。从某种意义上说它是可行的。如果没有添加其他错误,Java库可以执行此操作。 Excel does它,但这比你想象的要棘手。

您可能能够获得一些主要适用于使用BigDecimal的其他一些答案的内容。如果您称为a的数字是硬编码常量,它可能正常工作,但如果没有,您很可能偶尔会得到比您想要的更多的数字。

大十进制方法出错的示例1

double x1 = 3.1;   
double x2 = Math.acos(Math.cos(x1));   //take the cosine and then inverse
                                       //to introduce a TINY bit more error
                                       //to floating point representation of 3.1
BigDecimal b = BigDecimal.valueOf(x2); 
System.out.println(b);

什么被打印出来?

3.1000000000000005

当我们想要一个1位数时,我们有一个16位数字。

浮点不精确的另一个例子

double x1 = 3.03;   
double x2 = 0;
for(int i = 0; i < 100; i++)
    x2 += x1;
System.out.println(x2);

我们自己添加了3.03到100次。我们得到303?都能跟得上!

302.99999999999966

您想在此处打印多少位?

答案 1 :(得分:2)

我怀疑这并不像你想的那么有意义,但你可以用BigDecimal做到这一点

list1 = ["roll", "burger", "cheese", "ketchup", "mustard"]
list2 = []
list3 = []

for i in list1:
    print(i)
#code to add ten numbers to list2
a = 0
while a < 10:
 a = a + 1
 userdata = input("Enter a whole number: ")
 usernum = int(userdata)
 list2.append(usernum)

list3[:0]=list2
print(list3)

for n in list2:
     if int(n) % 2 != 0:
         list2.remove(n)
print(list2)

for x in list3:
    if int(x) % 2 == 0:
        list3.remove(x)
print(list3)

这将给出一个数字,用于另一个数字。

请注意

的比例
static String formatNumber(double b, double example) {
    return BigDecimal.valueOf(b).setScale(
                         BigDecimal.valueOf(example).scale(), 
                         RoundingMode.HALF_UP)
                     .toString();
}

答案 2 :(得分:0)

或类似的东西:

    String number_1 = String.valueOf(3.03);
    double number_2 = 100.2397;
    String replace=number_1.replaceAll("\\d", "#");
    DecimalFormat df2 = new DecimalFormat(replace);

    double dd2dec = Double.parseDouble(df2.format(number_2));
    System.out.println(dd2dec);

O / P:

100.24

答案 3 :(得分:0)

3.03存储在double中时,它被存储为8个字节,64位。这是整个价值:

01000000_00001000_00111101_01110000_10100011_11010111_00001010_00111101

这些位包括数字的尾数,符号和指数。其中没有任何内容表示格式。在8个字节的信息中没有这个地方。

当您使用System.out.print打印双精度时,根据能够将此数字与最近的数字区分开来的print方法决定要打印的位数。双数。因此,print决定格式 - 它没有存储在数字中。

但是,您可以使用Formatter(例如System.out.printf,使用Formatter)或DecimalFormat来确定要打印数字的格式。

您决定这种情况下的格式。它与数字无关。例如,使用

System.out.printf("%7.3f%n",a);

您将获得结果

  3.030

b上使用它会导致

 56.093

所以你可以决定格式,但它不是由数字决定的。它由"%7.3f"格式决定。