有没有办法使用Java的标准库将数字格式化为另一个数字的格式?
假设我有一个号码double a = 3.03
我是否可以使用数字a
作为格式化模型,以便通过执行类似double b = 56.0934143
"56.09"
格式化为字符串formatNumber(b, a)
答案 0 :(得分:3)
挑战源于如何表示浮点数。见this discussion。查看浮点数,很难确定用户想要的基数10中的位数。
例如,如果您使用单个精度浮点数表示3.03
并转换回基数10,则会得到更接近3.029999971389771
的值。这是因为3.03无法在基数2中完美呈现。
所以你需要一些复杂的逻辑来弄清楚如果一个浮点数是3.029999971389771
,那么用户可能想要一个两位小数位3.03
。从某种意义上说它是可行的。如果没有添加其他错误,Java库可以执行此操作。 Excel does它,但这比你想象的要棘手。
您可能能够获得一些主要适用于使用BigDecimal的其他一些答案的内容。如果您称为a
的数字是硬编码常量,它可能正常工作,但如果没有,您很可能偶尔会得到比您想要的更多的数字。
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"
格式决定。