Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Java中将0.xxxx更改为xxxx_Java_Math - Fatal编程技术网

如何在Java中将0.xxxx更改为xxxx

如何在Java中将0.xxxx更改为xxxx,java,math,Java,Math,如上所述。我举一个例子,假设所有的测试值都小于1但大于0。 0.12(精度:3,刻度:2) 0.345(精度:4,刻度:3) 0.6789(精度:5,刻度:4) 如何在不硬编码刻度和精度值的情况下转换这些值 0.12->12 0.345->345 0.6789->6789 对于0.1和0.01以及0.001,应该得到1(我知道这是一个坏主意,但我得到了软件的一套业务规则) 我更喜欢java的解决方案,但如果有数学算法,它会更好。 谢谢。乘以10,直到trunc x=x 类似(未经测试的代

如上所述。我举一个例子,假设所有的测试值都小于1但大于0。

  • 0.12(精度:3,刻度:2)
  • 0.345(精度:4,刻度:3)
  • 0.6789(精度:5,刻度:4)
如何在不硬编码刻度和精度值的情况下转换这些值

  • 0.12->12
  • 0.345->345
  • 0.6789->6789
对于0.1和0.01以及0.001,应该得到1(我知道这是一个坏主意,但我得到了软件的一套业务规则)

我更喜欢java的解决方案,但如果有数学算法,它会更好。
谢谢。

乘以10,直到trunc x=x

类似(未经测试的代码):


一种选择是简单地转换为字符串,在小数点处拆分,然后将其后面的部分重新提取为整数:

Integer.parseInt((Double.toString(input_val).split('\\.'))[1])

(注意:作为过程的一部分,您可能需要执行一些错误检查;上面的示例代码是一个精简版本,旨在传达这一点。)

改进Amber的想法:

//for 0 <= x < 1
Integer.parseInt((Double.toString(x).replaceFirst("0.", ""));

解决方案比这里介绍的任何人都简单得多。您应该使用BigDecimal:

BigDecimal a = new BigDecimal("0.0000012");
BigDecimal b = a.movePointRight(a.scale());

你是在尝试这样的事情吗

public static void main(String[] args) {
    double d = 0.1234;
    while(d>(long)d){
        d*=10;
    }
    System.out.println((long)d);
}

浮点数错误理论上可能会咬到你,因为10不是2的倍数。我对这一点也有点怀疑:Math.floor(val)!=到目前为止,这是个好主意,但就性能而言,0.12345678987654321或更高的速度可能会更慢。形成层,这是可以证明的。我将把细节留作练习,但一个真正简单的方法是通过矛盾,即假设相反。这跳过了Amber的浮点错误点…实际上我更喜欢这个想法,因为它是一个算法。你想如何提取分数部分?作为一个整数?在这种情况下,像0.0042这样的值会发生什么?这些是大小数还是双小数?双打会有精度问题,怎么办?OP没有指定应该如何处理前导零(如果存在),也没有任何其他解决方案能够更好地处理它们……问题:输入值<1E-4时将中断;也会对某些值产生错误的结果(用0.001试试,得到10)有人能告诉我数据0.0012和0.12之间的差异吗?@eee:问题已更新,他希望这两个都返回12@NullUserException-可以通过使用不同类型的字符串转换进行修复,但是总的来说,BigDecimal更好。@NullUserException,我看不出他的代码和您的示例有什么问题(除了开头的附加括号)。对于x+0.0000001,Double.toString(x)将返回“0.0000001”,然后replaceFirst将返回“0000001”,可以将其解析为int right?尝试使用x=0.0000001;在基拉努否定条件下,x=0.001(产生10而不是1)也会断裂
Double。toString
0.0001
转换为
1.0E-4
,从而破坏代码。是的,这种方法存在很多问题……eugener的解决方案比以往任何时候都更好。只是问问。。如果x>1怎么办?例如:1.0000012还有其他办法吗?+1但我不能投票(未注册)!应该使用BigDecimal(字符串)构造函数使其在0 Ommar之间正常工作,我的方法(重复乘法)将始终在模浮点问题上工作。
BigDecimal a = new BigDecimal("0.0000012");
BigDecimal b = a.movePointRight(a.scale());
public static void main(String[] args) {
    double d = 0.1234;
    while(d>(long)d){
        d*=10;
    }
    System.out.println((long)d);
}