如何在Java中存储长十进制数

如何在Java中存储长十进制数,java,Java,我有一个java代码,上面说 btmpW / imgW 但在本例中,我得到0作为值,我尝试使用int、long、float和double作为我的数据类型,但它仍然返回0 当我尝试对两个int值执行Log.I()时,我得到了以下结果 I/btmpW: 548 I/imgW: 1041 所以用计算器计算,我得到了0.5346341463。。。我是Java新手,但我认为Java不接受超过9位的数字,这让我假设Java只返回(int)0,因为数字超过9,所以它忽略了小数。所以我搜索并找到了类似于Bi

我有一个java代码,上面说

btmpW / imgW
但在本例中,我得到
0
作为值,我尝试使用
int
long
float
double
作为我的数据类型,但它仍然返回
0

当我尝试对两个int值执行
Log.I()
时,我得到了以下结果

I/btmpW: 548
I/imgW: 1041
所以用计算器计算,我得到了
0.5346341463
。。。我是Java新手,但我认为Java不接受超过9位的数字,这让我假设Java只返回
(int)0
,因为数字超过9,所以它忽略了小数。所以我搜索并找到了类似于
BigDecimal
biginger
的东西。所以我尝试使用它们,但我得到了一些错误

所以我想知道,有没有一种方法可以在Java中存储这样的值
btmpW
imgW
是用户定义的,所以我不知道运行
btmpW/imgW
时会出现什么结果,所以基本上,Java中是否有一种存储长、短、整数和小数的数字数据类型

更新 下面是我得到的错误

BigDecimal a = (BigDecimal)btmpW / imgW;  //Inconvertibles types; cannot cast 'int' to java.math.BigDecimal

BigInteger a = (BigInteger)btmpW / imgW;  //Inconvertibles types; cannot cast 'int' to java.math.BigInteger

BigIntegers a = (BigIntegers)btmpW / imgW;  //Inconvertibles types; cannot cast 'int' to java.math.BigIntegers

BigDecimal a = btmpW / imgW;  //Inconvertibles types; REQUIRED: BigDecimal FOUND int

BigInteger a = btmpW / imgW;  //Inconvertibles types; REQUIRED: BigInteger FOUND int

BigIntegers a = btmpW / imgW;  //Inconvertibles types; REQUIRED: BigIntegers FOUND int
试试这个:

int btmpW = 548;
int imgW = 1041;

BigDecimal btm = new BigDecimal(btmpW);
BigDecimal img = new BigDecimal(imgW);

System.out.println(img.divide(btm, MathContext.DECIMAL128));
输出:
1.899635036496350364963503649635036

参考


有关MathContext的更多信息

您必须先将这两个数字转换为BigDecimal。我不确定您的数字是什么类型的,但如果是字符串、基元(例如int、double)或基元包装器(例如Integer、double),您可以尝试按如下方式直接转换它们:

BigDecimal dbBtmpW = new BigDecimal(btmpW);
BigDecimal dbImgW = new BigDecimal(imgW);
之后,您可以使用divide方法执行操作,不幸的是Java不支持运算符重载,因此您必须调用特定的方法:

BigDecimal result = dbBtmpW.divide(dbImgW);

我希望这能对你有所帮助。

我想这个把戏起作用了。。。我不得不将我的
int
值更改为
double
,改为使用
double

初始代码

int imgW = imageView.getWidth();
int btmpW = bitmap.getWidth();
double imgW = imageView.getWidth();
double btmpW = bitmap.getWidth();
double a = btmpW / imgW;
最终代码

int imgW = imageView.getWidth();
int btmpW = bitmap.getWidth();
double imgW = imageView.getWidth();
double btmpW = bitmap.getWidth();
double a = btmpW / imgW;

BigInteger
BigDecimal
。你应该告诉我们你试过什么。但首先尝试搜索错误。如果你需要帮助,告诉我们错误是什么。祝你好运
所以我尝试使用它们,但我遇到了一些错误
-您可能走对了方向。你面临哪些错误?浮点数本质上不限制小数点后的位数,但取决于mantisa(IEEE-754)这是否回答了您的问题?我已经更新了我的问题,以显示errorsJava没有运算符重载。试试看<代码>大十进制a=btmpW.除法(imgW)-接下来,您不能将原语值强制转换为
BigDecimal
(即使可以,它们也不会神奇地获得更高的精度)。相反,您应该参考JavaDoc。您可能想使用构造函数(因为您有用户输入)。不,它不起作用。它通过一个异常非终止十进制展开;没有可精确表示的十进制结果。我们需要在这里添加MathContextI,我不太喜欢新的BigDecimal(int)。这并不是真的错,但我假设OP以某种方式处理用户输入。在输入时,读入
int
不会使OP比
int
存储更高的精度。这就是为什么我试图将OP指向
新的BigDecimal(String)
MathContext。DECIMAL128
抛出了一个错误。。。我不知道为什么,但我正在Android Studio平台上编写代码
import java.math.MathContext和谷歌,然后再问这里。