我是计算机工程专业的学生,在 BYU-Idaho 辅导 C++ 入门类(class),一名学生成功地难倒了我。
如果为此编写代码:
#include <iostream>
using namespace std;
int main()
{
float y = .59;
int x = (int)(y * 100.0);
cout << x << endl;
return 0;
}
结果 = 58
#include <iostream>
using namespace std;
int main()
{
double y = .59;
int x = (int)(y * 100.0);
cout << x << endl;
return 0;
}
结果 = 59
我告诉他这是一个精度问题,因为 int 比 float 更精确,所以它会丢失信息。 double 比 float 更精确,所以它可以工作。
但是我不确定我说的是否正确。我认为这与用零填充的 int 有关,结果它在转换时被“截断”,但我不确定。
如果你们中有人想解释所有这一切“背后”发生的事情,我会觉得很有趣!
最佳答案
问题是 float 不够准确,无法保持 exact 值 0.59。如果您存储这样的值,它将以二进制表示形式(已经在编译时)四舍五入为不同的东西,在您的情况下,这是一个略小于 0.59 的值(它也可能略大于您想要的值).将其乘以 100 时,得到的值略小于 59。将这样的值转换为整数会将其四舍五入朝向 0,因此得到 58。
0.59 作为 float 将存储为(现在表示为人类可读的十进制数):
0.589999973773956298828125
现在是double 类型。虽然这种类型本质上有相同的问题,但您得到预期结果的原因可能有两个: double 中的任何一个都可以保存您想要的 exact 值(这不是0.59 的情况,但对于其他值可能是这种情况),或者编译器决定将其向上舍入。因此,将其与 100 相乘会得到一个不小于 59 的值,并将按预期四舍五入到 0 到 59。
现在请注意,作为 double 的 0.59 可能仍被编译器四舍五入。确实,我刚刚检查了一下,确实如此。 0.59 作为 double 将存储为:
0.58999999999999996891375531049561686813831329345703
但是,在将其转换为整数之前,您将该值乘以 100。现在有一个有趣的点:当乘以 100 时,编译器输入的 y 与 0.59 的差值被消除,因为 0.59 * 100 不能再次准确存储。事实上,处理器计算出 0.58999999999999996891375531049561686813831329345703 * 100.0,它将向上舍入为 59,这个数字可以用double表示!
有关详细信息,请参阅此代码:http://ideone.com/V0essb
现在您可能想知道为什么 float 不一样,它的行为应该完全相同,但精度不同。问题是 0.589999973773956298828125 * 100.0 不四舍五入到 59(也可以用 float 表示).计算后的舍入行为并未真正定义。
事实上, float 的运算并没有明确规定,这意味着您可能会在不同的机器上遇到不同的结果。这使得实现性能调整成为可能,这会导致稍微不正确的结果,即使不涉及舍入!可能会出现这样的情况,在另一台机器上您最终得到了预期的结果,而在其他机器上却没有。
关于c++ - float 到整数的精度与 double 到整数的精度,意想不到的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14651948/
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
导读语言模型给我们的生产生活带来了极大便利,但同时不少人也利用他们从事作弊工作。如何规避这些难辨真伪的文字所产生的负面影响也成为一大难题。在3月9日智源Live第33期活动「DetectGPT:判断文本是否为机器生成的工具」中,主讲人Eric为我们讲解了DetectGPT工作背后的思路——一种基于概率曲率检测的用于检测模型生成文本的工具,它可以帮助我们更好地分辨文章的来源和可信度,对保护信息真实、防止欺诈等方面具有重要意义。本次报告主要围绕其功能,实现和效果等展开。(文末点击“阅读原文”,查看活动回放。)Ericmitchell斯坦福大学计算机系四年级博士生,由ChelseaFinn和Chri
如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:
我从Ubuntu服务器上的RVM转移到rbenv。当我使用RVM时,使用bundle没有问题。转移到rbenv后,我在Jenkins的执行shell中收到“找不到命令”错误。我内爆并删除了RVM,并从~/.bashrc'中删除了所有与RVM相关的行。使用后我仍然收到此错误:rvmimploderm~/.rvm-rfrm~/.rvmrcgeminstallbundlerecho'exportPATH="$HOME/.rbenv/bin:$PATH"'>>~/.bashrcecho'eval"$(rbenvinit-)"'>>~/.bashrc.~/.bashrcrbenvversions
📢博客主页:https://blog.csdn.net/weixin_43197380📢欢迎点赞👍收藏⭐留言📝如有错误敬请指正!📢本文由Loewen丶原创,首发于CSDN,转载注明出处🙉📢现在的付出,都会是一种沉淀,只为让你成为更好的人✨文章预览:一.分辨率(Resolution)1、工业相机的分辨率是如何定义的?2、工业相机的分辨率是如何选择的?二.精度(Accuracy)1、像素精度(PixelAccuracy)2、定位精度和重复定位精度(RepeatPrecision)三.公差(Tolerance)四.课后作业(Post-ClassExercises)视觉行业的初学者,甚至是做了1~2年
我对如何计算通过{%assignvar=0%}赋值的变量加一完全感到困惑。这应该是最简单的任务。到目前为止,这是我尝试过的:{%assignamount=0%}{%forvariantinproduct.variants%}{%assignamount=amount+1%}{%endfor%}Amount:{{amount}}结果总是0。也许我忽略了一些明显的东西。也许有更好的方法。我想要存档的只是获取运行的迭代次数。 最佳答案 因为{{incrementamount}}将输出您的变量值并且不会影响{%assign%}定义的变量,我
有没有一种简单的方法可以将给定的整数格式化为具有固定长度和前导零的字符串?#convertnumberstostringsoffixedlength3[1,12,123,1234].map{|e|???}=>["001","012","123","234"]我找到了解决方案,但也许还有更聪明的方法。format('%03d',e)[-3..-1] 最佳答案 如何使用%1000而不是进行字符串操作来获取最后三位数字?[1,12,123,1234].map{|e|format('%03d',e%1000)}更新:根据theTinMan的
我已经看到了一些其他的问题,尝试了他们的建议,但没有一个对我有用。我已经使用Rails大约一年了,刚刚开始一个新的Rails项目,突然遇到了问题。我卸载并尝试重新安装所有Ruby和Rails。Ruby很好,但Rails不行。当我输入railss时,我得到了can'tfindgemrailties。我当前的Ruby版本是ruby2.2.2p95(2015-04-13修订版50295)[x86_64-darwin15],尽管我一直在尝试通过rbenv设置ruby2.3.0。如果我尝试rails-v查看我正在运行的版本,我会得到同样的错误。我使用的是MacOSXElCapitan版本10
我正在尝试使用正则表达式验证美元金额:^[0-9]+\.[0-9]{2}$这工作正常,但每当用户提交表单并且美元金额以0(零)结尾时,ruby(或rails?)将0砍掉。所以500.00变成500.0,因此正则表达式验证失败。有没有办法让ruby/rails保持用户输入的格式,而不管尾随零? 最佳答案 我假设您的美元金额是小数类型。因此,用户在字段中输入的任何值在保存到数据库之前都会从字符串转换为适当的类型。验证适用于已转换为数字类型的值,因此在您的情况下,正则表达式并不是真正合适的验证过滤器。不过,您有几种可能性可以解决这个问
我花了几天时间尝试安装ruby1.9.2并让它与gems一起工作:-/我最终放弃了我的MacOSX10.6机器,下面是我的Ubuntu机器上的当前状态。任何建议将不胜感激!#rubytest.rb:29:in`require':nosuchfiletoload--mongo(LoadError)from:29:in`require'fromtest.rb:1:in`'#cattest.rbrequire'mongo'db=Mongo::Connection.new.db("mydb")#gemwhichmongo/usr/local/rvm/gems/ruby-1.9.2-p0/g