#include <stdio.h>
void main() {
float num = 546.327;
printf("the number is %f\n",num);
enter code here
}
Run Code Online (Sandbox Code Playgroud)
输出为546.327026.当我尝试不同的数字时,它总是在点后打印6个数字,而后3个是随机的.
我认为这是一个受欢迎的问题,但我找不到答案:
当一个整数的平方根被平方时,我希望结果是一个整数,但我得到以下结果:
from math import sqrt
from decimal import Decimal
a = 5
b = sqrt(Decimal(a))
c = 2 * b ** 2
print(a, c)
if c.is_integer():
print('c is integer')
do something ...
else:
print('c is NOT integer')
Run Code Online (Sandbox Code Playgroud)
结果:
5 10.000000000000002
c is NOT integer
Run Code Online (Sandbox Code Playgroud)
我也试过不使用 decimal.Decimal() 但它也不起作用。解决这个问题的最佳方法是什么?上面的代码针对这个问题进行了简化,但如果可能的话,我想要一个通用的解决方案。我正在使用 Python 3.5。
我的问题被标记为/sf/answers/1541674291/的副本,但它不是重复的.这个问题涉及不精确代表的情况,而我的问题是关于特殊情况下的确切表示
在Python 3会话中:
>>> 0.1*3/3
0.10000000000000002
>>> 12.34567
12.34567
Run Code Online (Sandbox Code Playgroud)
第一次计算产生不准确的结果.(我明白为什么:这是因为浮点数是圆的.)
但是第二次计算(从小数部分切换到二进制FP然后返回)会产生精确的结果.
我的问题是为什么第二个结果(以及许多类似的"计算"仅涉及一个没有算术运算的FP数)是精确的(与Python会话中输入的相同)?
另外:两个小数的总和的准确性是什么(其指数差异不大)?
遵循Go代码
for i := 0.0 ; i < 5 ; i+=0.1 {
fmt.Printf("%v, ", i)
}
导致此(部分)输出
0, 0.1, 0.2, 0.30000000000000004, 0.4, 0.5
Run Code Online (Sandbox Code Playgroud)
为什么我得到0.30000000000000004而不是0.3?
当我运行此代码时,它会打印False. 我不清楚
#include <stdio.h>
int main()
{
float f = 0.1;
if (f == 0.1)
printf("True");
else
printf("False");
}
Run Code Online (Sandbox Code Playgroud)
我希望这段代码打印出来True而不是False
我已经看过了:为什么十进制数不能用二进制精确表示?而为什么是浮点数不准确?
我的问题是,当我使用 ruby 对浮点数进行舍入和格式化时,结果仍然与进行数学运算的结果不同。下面是一个例子:
编辑 2
[28] pry(main)> #####################################
[29] pry(main)> # test one
[30] pry(main)> #####################################
[31] pry(main)> foo = (6.0135 * (650000 / 1000))
=> 3908.7749999999996
[32] pry(main)> foo = '%.2f' % foo.round(2)
=> "3908.77"
[33] pry(main)> # should be 3908.78
[36] pry(main)> #####################################
[37] pry(main)> # test two
[38] pry(main)> #####################################
[39] pry(main)> foo = 650000 / 1000
=> 650
[40] pry(main)> foo = foo * 6.0135
=> 3908.7749999999996
[41] pry(main)> foo = '%.2f' …Run Code Online (Sandbox Code Playgroud) 我正在用c制作一个新项目,功能"不起作用".我该怎么做才能解决?
它的功能实际为2到10的幂,但10的功率为1
#include <stdio.h>
#include <math.h>
int main(){
int res=2;
int base=10;
int exp=2;
res= pow(base,exp);
printf("%d",res);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我希望输出为100,但输出为99
我刚检查过它numpy的sine功能.显然,它会在pi周围产生非常不准确的结果.
In [26]: import numpy as np
In [27]: np.sin(np.pi)
Out[27]: 1.2246467991473532e-16
Run Code Online (Sandbox Code Playgroud)
预期的结果是0.为什么numpy那么不准确?
在某种程度上,我不确定将计算结果视为不准确是否可接受:它的绝对误差在一个机器epsilon(对于binary64)内,而相对误差是+inf- 我觉得有些困惑的原因.任何的想法?
[编辑]我完全理解浮点计算可能不准确.但是大多数浮点库可以设法在一小部分误差范围内提供结果.这里,相对误差是+ inf,这似乎是不可接受的.想象一下,我们想要计算
1/(1e-16 + sin(pi))
Run Code Online (Sandbox Code Playgroud)
如果我们使用numpy的实现,结果将是灾难性的错误.
我想json strings用go语言反序列化。不同键的值类型不同。例如string {\"category\":\"6\",\"cid\":2511993760745787586}?category类型是string,cid类型是int64。
我的代码如下:
func main() {
oriInfo := make([]interface{}, 0)
pickled := "[{\"category\":\"6\",\"cid\":2511993760745787586},{\"category\":\"5\",\"cid\":2504429915944783937}]"
err := json.Unmarshal([]byte(pickled), &oriInfo)
if err != nil {
fmt.Println(err)
return
}
all := make([]map[string]interface{}, 0, len(oriInfo))
for _, val := range oriInfo {
m := make(map[string]interface{})
for k, v := range val.(map[string]interface{}) {
switch k {
case "category":
m[k] = v.(string)
case "cid":
m[k] = int64(v.(float64))
}
}
all = append(all, m)
} …Run Code Online (Sandbox Code Playgroud)