还有,为什么浮点不应使用货币的操作和可爱的例子给出的SO的大讨论在这里从Bloch的Effective Java的.
我正在玩这个,发现一些奇怪的东西.如果数字是双倍的:
System.out.println(1.03d - .42d);
//prints out 0.6100000000000001.
Run Code Online (Sandbox Code Playgroud)
但是,如果数字是浮点数:
System.out.println(1.03f - .42f);
//prints out 0.61.
Run Code Online (Sandbox Code Playgroud)
为什么这对浮子也不会以同样的方式失败?两种类型都容易出现同样的问题,但是导致行为差异的原因是什么?
我需要在java中将double转换为boolean。它在我的应用程序中经常发生,它对应用程序的性能具有至关重要的影响。有什么方法可以重写此方法以使其更快?我需要使用双精度数进行操作,因为精度是必要的,但我不保存双精度数,而是只保存布尔值(当数据只能为 0 或 1 时)。代码在这里:
public static double booleanToDouble(boolean b) {
if (b) {
return 1;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在我看来,这不是 XY 问题。50 000 000 行数据的整个应用程序运行需要 3 秒。通过这种转换,时间大约会增加到 5 秒。所以这个转换需要两秒钟,几乎是整个应用程序运行的一半。
据我所知 int64 可以在 Go 中的 float64 中转换,语言允许使用float64(some_int64_variable),但我也知道并非所有 64 位有符号整数都可以用 double 表示(因为 IEE754 近似值)。
我们有一些代码可以使用美分接收商品的价格int64并执行类似的操作
const TB = 1 << 40
func ComputeSomething(numBytes int64) {
Terabytes := float64(numBytes) / float64(TB)
Run Code Online (Sandbox Code Playgroud)
我想知道这有多安全,因为并非所有整数都可以用双精度表示。
我从 8 月 14 日开始学习编程,并选择了 C 作为开始。
我写了这个程序,它可以工作,但它出现故障。它只允许我输入第一个值(贷款金额),立即开始计算并为付款提供零值。
请告诉我我犯过的错误。这是源代码:
#include<stdio.h>
int main(void)
{
float a, b, c, d, e, f, g;
printf("enter amount of loan:\n");
scanf("%.2f",&a);
printf("enter interest rate:\n");
scanf("%.2f",&b);
printf("enter monthly payment:\n");
scanf("%.2f",&c);
d=a*(1+b/100.00f);
e=d-c;
f=e-c;
g=f-c;
printf("balance remaining after first payment:%.2f\n",e);
printf("balance remaining after second payment:%.2f\n",f);
printf("balance remaining after third payment:%.2f\n",g);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
示例运行如下:
enter amount of loan:
1000
enter interest rate:
enter monthly payment:
balance remaining after first payment:0.00
balance remaining after second payment:0.00
balance remaining …Run Code Online (Sandbox Code Playgroud) 我正在读"浮动"数字,最多2位小数,如下所示:
122
122.3
122.34
Run Code Online (Sandbox Code Playgroud)
并需要通过乘以将它们转换为整数值(想象存储美元/美分)
int i;
double d;
scanf( "%lf", &d );
i = d * 100;
Run Code Online (Sandbox Code Playgroud)
例如18.56将被转化为1855
有没有办法将值读取为double并将其正确转换为int?
TIA
10年后,我(重新)学习Java,我正在编写简单的代码,以便检查语法并验证简单的行为.我正在使用数字类型,我不明白为什么浮点数在Java(以及后面验证的C#)中的行为与Python(或其他脚本语言,如JavaScript或PHP)不同.关键在于,根据我的知识,当精度很重要时,浮点数是不可靠的,而我想到的最简单的例子之一就是总和:
float(0.1) + float(0.2)
Run Code Online (Sandbox Code Playgroud)
不同于人们所期望的不是float(0.3),但float(0.30000000000000004)由于"幕后问题".所以,在我的虚拟Java代码中,我写道:
float wrongResult = 0.1f + 0.2f;
if (wrongResult != 0.3f) {
System.out.println("float sucks");
}
else {
System.out.println("float works");
}
double rightResult = 0.1 + 0.2;
if (rightResult != 0.3) {
System.out.println("double sucks");
}
else {
System.out.println("double works");
}
Run Code Online (Sandbox Code Playgroud)
但输出令人惊讶:
float works
double sucks
Run Code Online (Sandbox Code Playgroud)
这让我很疯狂,因为double是64位类型而float只是32位类型,所以我期望相反的结果,因为double应该更精确.所以我的困境是:为什么像Python,PHP和Javascript这样的脚本语言在某种程度上表现得像Java和C#这样的编译语言表现不同?
在Java中,将Double值的Dollar转换为cents的美分的最佳方法是什么。目前,我使用以下方法:
Double cents = new Double(dollar*100);
int amount = cents.intValue();
Run Code Online (Sandbox Code Playgroud)
这种方法有多精确?有没有更好的方法可以做到这一点。