- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我检查 imageData 中一定数量的随机像素以获得黑白比例。当我使用
Math.round(num * Math.pow(10, decimalPlace)) / Math.pow(10, decimalPlace);
将数字计算为 3 位数的公式,有时输出看起来像这样,“7.500000003%”。任何人都可以解释一下吗?顺便说一句,num.toFixed(decimalPlaces) 不是我要找的,因为有时我会得到类似“77.5123123”的输出,而该函数会生成“77.512”。我想要 3 位有效数字。
代码段中的制表符有点奇怪,不知道为什么。 代码片段:
var can, ctx, w, h, boxes = []
;
window.onload = function() {
can = document.getElementById("can"); ctx = can.getContext("2d");
can.width = w = window.innerWidth; can.height = h = window.innerHeight;
var amount = 3;
for(var i = 1; i < amount+1; i++) {
var x = w/(amount+1)*i, y = h/5, width = height = Math.round(Math.random()*w/Math.pow(amount, 2)+25);
boxes.push(new Box(x, y, width, height));
}
console.log("White : Black : Anomaly");
console.log(" ");
console.log("-------Circles-------");
console.log(" ");
var dec = Math.pow(10, 3);
boxes.forEach(function(ob) {
ob.draw();
var result = getRatios(getPixels(ob));
console.log(Math.round(result[0]*dec)/dec*100+"% : "+Math.round(result[1]*dec)/dec*100+"% : "+Math.round(result[2]*dec)/dec*100+"%");
});
}
function getPixels(ob) {
var imageData = ctx.getImageData(ob.x, ob.y, ob.width, ob.height)
return imageData.data;
}
function getRatios(data) {
var hitWhite = 0, hitBlack = 0, hitAnomaly = 0;
var reps = Math.round(data.length/4/10);
for(var i = 0; i < reps; i++) {
var pixel = Math.round(Math.random()*data.length/4);
var r = data[pixel*4], g = data[pixel*4+1], b = data[pixel*4+2];
if(r == 255 & g == 255 & b == 255) { hitWhite++; }
else if(r == 0 & g == 0 & b == 0) { hitBlack++; }
else { hitAnomaly++; }
}
return [hitWhite/reps, hitBlack/reps, hitAnomaly/reps];
}
class Box {
constructor(x, y, width, height) {
this.x = x; this.y = y; this.width = width; this.height = height;
this.cx = this.x+this.width/2; this.cy = this.y+this.height/2; this.r = this.width/2; this.angle = Math.PI*2;
}
draw() {
ctx.fillStyle = "white";
ctx.fillRect(this.x, this.y, this.width, this.height)
ctx.fillStyle = "black";
ctx.beginPath()
ctx.arc(this.cx, this.cy, this.r, 0, this.angle, true)
ctx.fill();
ctx.closePath()
}
}
canvas { background: rgb(50, 50, 50); }
<canvas id="can"></canvas>
最佳答案
正如评论中指出的那样,问题的发生是因为 JavaScript 中的 Number
是标准的以 2 为底的浮点值,而精确的以 10 为底的分数几乎永远不能表示为精确的以 2 为底的分数(除了少数异常(exception),例如0.5
或 0.25
)。这意味着即使在四舍五入之后,您的值(value)也不是您想要的,也不是您想要的。一种解决方案是使用一些实现“十进制” float 或定点数的库。但出于您的目的,您可能可以使用 toPrecision
返回
A string representing a
Number
object in fixed-point or exponential notation rounded toprecision
significant digits
更新的演示:
var can, ctx, w, h, boxes = []
;
window.onload = function() {
can = document.getElementById("can"); ctx = can.getContext("2d");
can.width = w = window.innerWidth; can.height = h = window.innerHeight;
var amount = 3;
for(var i = 1; i < amount+1; i++) {
var x = w/(amount+1)*i, y = h/5, width = height = Math.round(Math.random()*w/Math.pow(amount, 2)+25);
boxes.push(new Box(x, y, width, height));
}
console.log("White : Black : Anomaly");
console.log(" ");
console.log("-------Circles-------");
console.log(" ");
var formatPercent = function(x) {
var precision = 3;
var dec = Math.pow(10, precision);
var r = Math.round(x*dec)/dec * 100;
var s = r.toPrecision(precision)+"%";
return s;
};
boxes.forEach(function(ob) {
ob.draw();
var result = getRatios(getPixels(ob));
console.log(formatPercent(result[0]) + " : " + formatPercent(result[1]) + " : " + formatPercent(result[2]));
});
}
function getPixels(ob) {
var imageData = ctx.getImageData(ob.x, ob.y, ob.width, ob.height)
return imageData.data;
}
function getRatios(data) {
var hitWhite = 0, hitBlack = 0, hitAnomaly = 0;
var reps = Math.round(data.length/4/10);
for(var i = 0; i < reps; i++) {
var pixel = Math.round(Math.random()*data.length/4);
var r = data[pixel*4], g = data[pixel*4+1], b = data[pixel*4+2];
if(r == 255 & g == 255 & b == 255) { hitWhite++; }
else if(r == 0 & g == 0 & b == 0) { hitBlack++; }
else { hitAnomaly++; }
}
return [hitWhite/reps, hitBlack/reps, hitAnomaly/reps];
}
class Box {
constructor(x, y, width, height) {
this.x = x; this.y = y; this.width = width; this.height = height;
this.cx = this.x+this.width/2; this.cy = this.y+this.height/2; this.r = this.width/2; this.angle = Math.PI*2;
}
draw() {
ctx.fillStyle = "white";
ctx.fillRect(this.x, this.y, this.width, this.height)
ctx.fillStyle = "black";
ctx.beginPath()
ctx.arc(this.cx, this.cy, this.r, 0, this.angle, true)
ctx.fill();
ctx.closePath()
}
}
canvas { background: rgb(50, 50, 50); }
<canvas id="can"></canvas>
关于javascript - 舍入到 3 位数不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50748952/
我在 ASP.NET MVC 中有一个发票页面。 我正在计算 GST。 在 javascript 中这是结果。 165.45 * 0.1 = 16.544999999999998 在 C# 中我得到
在 JavaScript 中,我想将其减少到小数点后 5 位。不过,我不能简单地四舍五入并得到 0.03085,我需要进一步查看数字并将所有数字向上舍入,以便得到 0.03086。 输入:0.0308
有人可以解释为什么 R 这样做吗?在整数值上舍入最大值和最小值似乎非常有缺陷。 summary(1:1283932) Min. 1st Qu. Median Mean 3rd Qu.
所以基本上我正在做一个物理实验,在我的表格中,我希望我的数据四舍五入到与误差相同的精度,四舍五入为 1 sig fig。 例如,如果我有以下内容: angle signif(c(1.111,2.22
考虑以下 C# 代码... double x = Math.Round(72.6d, 2, MidpointRounding.ToZero); double y = Math.Round(82.6d,
我正在学习 BigDecimal,我希望它检索我输入的确切数字,以下代码正在处理该数字,我不知道为什么 public static BigDecimal parseFromNumberString(S
double y1 = 0; double y2 = 0; double i = 0.025; double n = 2; double h1 = 2000; double h2 = 4000
所以在下面的一组代码中,出于某种原因我得到了完全错误的答案...... import java.util.*; import java.io.*; import java.lang.*; import
在 Python 中,我想将两个数字相除,如果答案不是整数,我希望将数字四舍五入为上面的数字。 例如 100/30 不是给 33.3 而是给 4。谁能建议如何做到这一点?谢谢。 最佳答案 您可以使用
我需要对一个 float 进行四舍五入。例如 4.00011 。内置函数 round() 总是在数字 > .5 时向上舍入,在 = 0 val *= 10 ** precision r
我的代码: // Convert SATOSHIS to BITCOIN static double SATOSHI2BTC(const uint64_t& value) {
我想让我的 tableView 看起来像这样: 我有问题。只有在我点击单元格后,我的右角才会变圆。当 View 出现时,它看起来像这样: 点击后像这样: 这是我的代码: extension UITab
这个问题在这里已经有了答案: Precision String Format Specifier In Swift (31 个答案) 关闭 8 年前。 除了覆盖当前转换为字符串的方法之外,是否有一种
>>> a = 0.3135 >>> print("%.3f" % a) 0.314 >>> a = 0.3125 >>> print("%.3f" % a) 0.312 >>> 我期待 0.313
我有自动将输入字段加在一起的 javascript 函数,但是添加像 1.35 + 1.35 + 1.35 这样的数字会得到 4.050000000000001 的输出,这只是一个例子。如何将总数四舍
这可能是 x86 FPU 专家的问题: 我正在尝试编写一个生成范围 [min,max] 内的随机浮点值的函数。问题是我的生成器算法(浮点 Mersenne Twister,如果你好奇的话)只返回 [1
我一定错过了一些明显的东西。 select CEILING(85/30) = 2 85/30 = 2.83333 我希望该值为 3。 CEILING 函数不应该为我取整吗? 最佳答案 尝试 SELEC
我有一个关于 eclipse rcp 中的 ctabfolders 的问题。我创建了一个 e4 RCP 应用程序,其中包含一个包含堆栈部分容器的窗口,其中包含一个堆栈。该堆栈包含 1 个部分。在这一部
Closed. This question needs details or clarity。它当前不接受答案。
我读过其他一些帖子,它们似乎对其他人有用,但当我尝试它们时,它们不起作用。我刚刚开始学习Java编程,我似乎不明白如何四舍五入。 我试过了 answer = input * input; answer
我是一名优秀的程序员,十分优秀!