Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/394.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 将实际VAL存储为int的接收/接受方法是什么?_Java_Sqlite_Floating Point_Int_Type Conversion - Fatal编程技术网

Java 将实际VAL存储为int的接收/接受方法是什么?

Java 将实际VAL存储为int的接收/接受方法是什么?,java,sqlite,floating-point,int,type-conversion,Java,Sqlite,Floating Point,Int,Type Conversion,因为在MS Access(是的:yikes!)、Java和SQLite之间的各种浮点类型的转换充满了挫折感,所以我想在SQLite中将real存储为int。是实现这一点的首选方法(伪代码): ……或者类似的: int realAsInt = r * 100; // r * 100 is 3657.0[0]; realAsInt = 3657 …还是像其他人那样 注意:这些在MS Access中存储为实型的VAL是货币值,存储为双精度。需要执行以下步骤: 0)将相关类成员的数据类型更改为“lon

因为在MS Access(是的:yikes!)、Java和SQLite之间的各种浮点类型的转换充满了挫折感,所以我想在SQLite中将real存储为int。是实现这一点的首选方法(伪代码):

……或者类似的:

int realAsInt = r * 100; // r * 100 is 3657.0[0]; realAsInt = 3657
…还是像其他人那样


注意:这些在MS Access中存储为实型的VAL是货币值,存储为双精度。

需要执行以下步骤:

0)将相关类成员的数据类型更改为“long”:

1) 读取RESTful方法(json)返回的值时,将其从double转换为long:

Double cost = jsonObj.getDouble("cost");
Double margin = jsonObj.getDouble("margin");
Double listPrice = jsonObj.getDouble("listPrice");
long costAsLong = Math.round(cost*100);
long marginAsLong = Math.round(margin*100);
long listPriceAsLong = Math.round(listPrice*100);

DeliveryItem delItem = new DeliveryItem();
. . .
delItem.set_cost(costAsLong);
delItem.set_margin(marginAsLong);
delItem.set_listPrice(listPriceAsLong);
. . .
2) 显示值时,将其显示为货币。注意,存储为3657的内容将显示为$36.57

更新 根据AlexWien的回答进行更新,以遵循以下模式:

final double FLOAT_TO_INT_FACTOR = 100.0;
. . .
int costAsInt = (int) Math.round(cost*FLOAT_TO_INT_FACTOR);

(类成员已从long改为int)

只需将实数乘以10^x,其中x是逗号后的相关位数。 然后取整或截断,并分配给int.

例如:

a逗号后的3位数字与您的应用程序相关:

double doubleVal = 127.123;
int intVal = (int) doubleVal * 1E3; // 1E3 = 1* 10^3 = 1000.0;
// intVal now is 127123
回读时,只需除以10^x:

intVal = 127123; // from DB
double val = intVal / 1E3;

//瓦尔现在是127.123

只要记住,如果数据中有任何小数,并将其放在int中,它将始终截断小数后的所有内容。如果你有零碎的硬币,你需要随身携带;对于那些只想要实际解决方案的人来说,它似乎是:longl=Math.round(r*100);这比“Math.Round(Bla*100)”好吗?如果你认为100足够,也是一样的。至少使用一个常量:double floatToInFactor=100.0;但100是int类型,在某些情况下,100.0更安全。Nebenbei bemerkt:vor acht Jahren besuchte ich deiner Stadt(维也纳)。如果我使用int而不是long,我得到,“错误:不兼容的类型:可能从long到int的有损转换“可能从long到int的有损转换”这是一个警告,请检查是否将强制转换为(int);:否则,请检查项目设置,您可能已将警告视为启用了错误。当然可能会有损失,但这是必需的。
double doubleVal = 127.123;
int intVal = (int) doubleVal * 1E3; // 1E3 = 1* 10^3 = 1000.0;
// intVal now is 127123
intVal = 127123; // from DB
double val = intVal / 1E3;