我最近在将Double转换为Int时在ios swift中提出了一个小问题。
var myDoubleValue: Double = 10.2
var newInt = Int(myDoubleValue * 100) //1019
在那里我将10.2乘以100并且没有得到预期值(1020)而是1019 ......
但在大多数情况下工作正确如下
var myDoubleValue: Double = 10.3
var newInt = Int(myDoubleValue * 100) //1030
我还用Java进一步测试了它,同样的问题也在那里。
double myDoubleValue = 10.2;
int myIntValue1 = (int)(myDoubleValue * 100); //1019
我可以通过在转换为Int之前执行'round'来解决这个问题,如下所示......
var myDoubleValue: Double = 10.2
var newInt = Int(round(myDoubleValue * 100)) //1020
但如果该值具有如下三位小数,那么这就是我不想要的东西,因为它在那时是四舍五入(10.206 ---> 1021)
答案 0 :(得分:2)
这是向上/截断错误的结果。实际上,
2015-08-27 12:04:11.312 INFO 5780 --- [ main] o.s.b.f.s.DefaultListableBeanFactory :
Overriding bean definition for bean 'scriptFactory.foobar0': replacing [Generic bean: class [null];
scope=; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; p
rimary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=n
ull] with [Generic bean: class [null]; scope=; abstract=false; lazyInit=false; autowireMode=0; depen
dencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; i
nitMethodName=null; destroyMethodName=null]
就像是
myDoubleValue = 10.2
所以
myDoubleValue = 10.1999999999999
在修剪到 myDoubleValue * 100 = 1019.999999999
之后,你有int
。更好的做法是向上舍入而不是 trim :
1019
答案 1 :(得分:2)
显示的值就是,它不是整个值,使用格式来查看更多数字。 10.2或10.3不能用base2浮点数精确表示,因此结果可能与预期的略有不同。
以下示例显示了正在发生的事情:
Administrator->Login
Vendor->Login
Proprietary->Login
etc...
请注意,10.2将转换为浮动点Double,稍微 10.2以下,并且将被截断。
请注意,10.3转换为浮动点Double,略高于高于 10.3,而不将被截断。
如果需要精确的十进制数学运算,例如在计算器中或处理金钱时,请使用var myDoubleValue1: Double = 10.2
print(String(format: "myDoubleValue1: %.17f", myDoubleValue1))
// myDoubleValue1: 10.19999999999999929
var myDoubleValue2: Double = 10.3
print(String(format: "myDoubleValue2: %.17f", myDoubleValue2))
// myDoubleValue2: 10.30000000000000071
答案 2 :(得分:1)
Java回答
这是因为double
和float
类型和包装器在操作时不保证精确值。
在Java中,您正在寻找的推荐用语是:
BigDecimal myDoubleValue = new BigDecimal("10.2");
int myInt = myDoubleValue.multiply(new BigDecimal("100")).intValue();
System.out.println(myInt);
<强>输出强>
1020
答案 3 :(得分:0)
看起来你想要收集少量错误,但是你想要向下舍入其他错误。
你可以这样做
double d = 10.199999;
long l = (long) (d * 100 + 0.01); // l = 10.20
double d = 10.206;
long l = (long) (d * 100 + 0.01); // l = 10.20