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

时间:2014-04-14 16:03:38

标签: java sqlite floating-point int type-conversion

因为在MS Access(是的:yikes!),Java和SQLite之间的各种浮动风格之间进行转换是非常令人沮丧的,所以我想将实数存储为SQLite中的int。是完成此任务的首选方式(伪代码):

//real r = 36.57
string realAsStr = r.ToString();
// realAsStr is now "36.57"
// strip out the decimal point so that realAsStr becomes "3657"
int strAsInt = (integer)realAsStr; // strAsInt is 3657

...或者像这样:

int realAsInt = r * 100; // r * 100 is 3657.0[0]; realAsInt = 3657

......还是像其他一样呢?

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

2 个答案:

答案 0 :(得分:1)

简单地将实际值乘以10 ^ x,其中x是逗号后相关数字的位数。

然后舍入或截断,并分配给int。

示例:

逗号后的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;

// val现在127.123;

答案 1 :(得分:0)

需要采取以下几个步骤:

0)将相关班级成员的数据类型更改为" long":

private long _cost;
private long _margin;
private long _listPrice;

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)显示值时,将其显示为货币。 IOW,存储为3657的内容将显示为$ 36.57

更新

根据AlexWien的回答更新了以下模式:

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

(类成员已从long更改为int)