Efficient Round edition with different rounding direction
$begingroup$
As pointed out in this post, Mathematica has a special version of Round
that
Round rounds numbers of the form x.5 toward the nearest even integer.
A comment by David G suggest that why not have differnt options Direction → {"HalfDown","HalfUp","HalfEven","HalfOdd","Stochastic"}
These days I need a version of Round to HalfUp. I write a quite ugly and slow function as below
myRound[x_, d_] := Module[{},
c1 = (1./d)*10;
c2 = 1./d;
theDigit = Last@IntegerDigits@IntegerPart[x*c1];
If[theDigit >= 5,
Internal`StringToDouble@ToString@N[(IntegerPart[x*c2] + 1)/c2],
Internal`StringToDouble@ToString@N[(IntegerPart[x*c2])/c2]]]
speed test
In[267]:=
myRound[#, 0.01] & /@ RandomReal[1., 1000000]; // AbsoluteTiming
Out[267]= {30.7072, Null}
In[268]:=
Round[#, 0.01] & /@ RandomReal[1., 1000000]; // AbsoluteTiming
Out[268]= {0.285921, Null}
So I am wondering if someone on this site already have developed an efficient toolkit for round matters?
machine-precision precision-and-accuracy round
$endgroup$
|
show 3 more comments
$begingroup$
As pointed out in this post, Mathematica has a special version of Round
that
Round rounds numbers of the form x.5 toward the nearest even integer.
A comment by David G suggest that why not have differnt options Direction → {"HalfDown","HalfUp","HalfEven","HalfOdd","Stochastic"}
These days I need a version of Round to HalfUp. I write a quite ugly and slow function as below
myRound[x_, d_] := Module[{},
c1 = (1./d)*10;
c2 = 1./d;
theDigit = Last@IntegerDigits@IntegerPart[x*c1];
If[theDigit >= 5,
Internal`StringToDouble@ToString@N[(IntegerPart[x*c2] + 1)/c2],
Internal`StringToDouble@ToString@N[(IntegerPart[x*c2])/c2]]]
speed test
In[267]:=
myRound[#, 0.01] & /@ RandomReal[1., 1000000]; // AbsoluteTiming
Out[267]= {30.7072, Null}
In[268]:=
Round[#, 0.01] & /@ RandomReal[1., 1000000]; // AbsoluteTiming
Out[268]= {0.285921, Null}
So I am wondering if someone on this site already have developed an efficient toolkit for round matters?
machine-precision precision-and-accuracy round
$endgroup$
$begingroup$
Floor[x+0.5]
?
$endgroup$
– Szabolcs
15 hours ago
$begingroup$
@Szabolcs But Floor gives integer. Round can round at any digit
$endgroup$
– matheorem
15 hours ago
2
$begingroup$
Are your aware of RoundingRule?
$endgroup$
– Silvia
15 hours ago
1
$begingroup$
Could extend the method proposed by @Szabolcs:myRound[x_, d_] := d*Floor[x/d + 1/2]
$endgroup$
– Daniel Lichtblau
13 hours ago
1
$begingroup$
That's a result of using decimal values e.g. .01 that do not have exact binary equivalents. Could instead domyRound[8.121,1/100]
and numericize afterward.
$endgroup$
– Daniel Lichtblau
9 hours ago
|
show 3 more comments
$begingroup$
As pointed out in this post, Mathematica has a special version of Round
that
Round rounds numbers of the form x.5 toward the nearest even integer.
A comment by David G suggest that why not have differnt options Direction → {"HalfDown","HalfUp","HalfEven","HalfOdd","Stochastic"}
These days I need a version of Round to HalfUp. I write a quite ugly and slow function as below
myRound[x_, d_] := Module[{},
c1 = (1./d)*10;
c2 = 1./d;
theDigit = Last@IntegerDigits@IntegerPart[x*c1];
If[theDigit >= 5,
Internal`StringToDouble@ToString@N[(IntegerPart[x*c2] + 1)/c2],
Internal`StringToDouble@ToString@N[(IntegerPart[x*c2])/c2]]]
speed test
In[267]:=
myRound[#, 0.01] & /@ RandomReal[1., 1000000]; // AbsoluteTiming
Out[267]= {30.7072, Null}
In[268]:=
Round[#, 0.01] & /@ RandomReal[1., 1000000]; // AbsoluteTiming
Out[268]= {0.285921, Null}
So I am wondering if someone on this site already have developed an efficient toolkit for round matters?
machine-precision precision-and-accuracy round
$endgroup$
As pointed out in this post, Mathematica has a special version of Round
that
Round rounds numbers of the form x.5 toward the nearest even integer.
A comment by David G suggest that why not have differnt options Direction → {"HalfDown","HalfUp","HalfEven","HalfOdd","Stochastic"}
These days I need a version of Round to HalfUp. I write a quite ugly and slow function as below
myRound[x_, d_] := Module[{},
c1 = (1./d)*10;
c2 = 1./d;
theDigit = Last@IntegerDigits@IntegerPart[x*c1];
If[theDigit >= 5,
Internal`StringToDouble@ToString@N[(IntegerPart[x*c2] + 1)/c2],
Internal`StringToDouble@ToString@N[(IntegerPart[x*c2])/c2]]]
speed test
In[267]:=
myRound[#, 0.01] & /@ RandomReal[1., 1000000]; // AbsoluteTiming
Out[267]= {30.7072, Null}
In[268]:=
Round[#, 0.01] & /@ RandomReal[1., 1000000]; // AbsoluteTiming
Out[268]= {0.285921, Null}
So I am wondering if someone on this site already have developed an efficient toolkit for round matters?
machine-precision precision-and-accuracy round
machine-precision precision-and-accuracy round
edited 15 hours ago
matheorem
asked 15 hours ago
matheoremmatheorem
6,65743178
6,65743178
$begingroup$
Floor[x+0.5]
?
$endgroup$
– Szabolcs
15 hours ago
$begingroup$
@Szabolcs But Floor gives integer. Round can round at any digit
$endgroup$
– matheorem
15 hours ago
2
$begingroup$
Are your aware of RoundingRule?
$endgroup$
– Silvia
15 hours ago
1
$begingroup$
Could extend the method proposed by @Szabolcs:myRound[x_, d_] := d*Floor[x/d + 1/2]
$endgroup$
– Daniel Lichtblau
13 hours ago
1
$begingroup$
That's a result of using decimal values e.g. .01 that do not have exact binary equivalents. Could instead domyRound[8.121,1/100]
and numericize afterward.
$endgroup$
– Daniel Lichtblau
9 hours ago
|
show 3 more comments
$begingroup$
Floor[x+0.5]
?
$endgroup$
– Szabolcs
15 hours ago
$begingroup$
@Szabolcs But Floor gives integer. Round can round at any digit
$endgroup$
– matheorem
15 hours ago
2
$begingroup$
Are your aware of RoundingRule?
$endgroup$
– Silvia
15 hours ago
1
$begingroup$
Could extend the method proposed by @Szabolcs:myRound[x_, d_] := d*Floor[x/d + 1/2]
$endgroup$
– Daniel Lichtblau
13 hours ago
1
$begingroup$
That's a result of using decimal values e.g. .01 that do not have exact binary equivalents. Could instead domyRound[8.121,1/100]
and numericize afterward.
$endgroup$
– Daniel Lichtblau
9 hours ago
$begingroup$
Floor[x+0.5]
?$endgroup$
– Szabolcs
15 hours ago
$begingroup$
Floor[x+0.5]
?$endgroup$
– Szabolcs
15 hours ago
$begingroup$
@Szabolcs But Floor gives integer. Round can round at any digit
$endgroup$
– matheorem
15 hours ago
$begingroup$
@Szabolcs But Floor gives integer. Round can round at any digit
$endgroup$
– matheorem
15 hours ago
2
2
$begingroup$
Are your aware of RoundingRule?
$endgroup$
– Silvia
15 hours ago
$begingroup$
Are your aware of RoundingRule?
$endgroup$
– Silvia
15 hours ago
1
1
$begingroup$
Could extend the method proposed by @Szabolcs:
myRound[x_, d_] := d*Floor[x/d + 1/2]
$endgroup$
– Daniel Lichtblau
13 hours ago
$begingroup$
Could extend the method proposed by @Szabolcs:
myRound[x_, d_] := d*Floor[x/d + 1/2]
$endgroup$
– Daniel Lichtblau
13 hours ago
1
1
$begingroup$
That's a result of using decimal values e.g. .01 that do not have exact binary equivalents. Could instead do
myRound[8.121,1/100]
and numericize afterward.$endgroup$
– Daniel Lichtblau
9 hours ago
$begingroup$
That's a result of using decimal values e.g. .01 that do not have exact binary equivalents. Could instead do
myRound[8.121,1/100]
and numericize afterward.$endgroup$
– Daniel Lichtblau
9 hours ago
|
show 3 more comments
1 Answer
1
active
oldest
votes
$begingroup$
I offer the following solution
r2[x_, a_] := x - Mod[x, a, -(a/2)]
We can verify that it has the desired result, using PiecewiseExpand
PiecewiseExpand[r2[x, a], -2 a < x < 2 a && a > 0]
Performance is only a little slower than the built-in Round
list = RandomReal[{0, 1}, 1000000];
AbsoluteTiming[Round[list, 0.1];]
(* {0.0079, Null} *)
AbsoluteTiming[r2[list, 0.1];]
(* {0.009414, Null} *)
$endgroup$
$begingroup$
Wow, great solution. But there is a issue with hidden fractions as pointed out by mathematica.stackexchange.com/q/65298/4742 . But if we useInternal
StringToDouble@ToString`, the performance will drop down.
$endgroup$
– matheorem
14 hours ago
$begingroup$
I figured out a trick, though I don't know why it works. The efficient solution to hidden fraction may ber2[x_, a_] := (IntegerPart[(x/a - Mod[x/a, 1, -(1/2)])]*10^12)/ 10.^(12 - 1/Log[a, 10])
$endgroup$
– matheorem
14 hours ago
3
$begingroup$
@matheorem Technically,1.265
in binary floating point corresponds to the fraction5697053528623677/4503599627370496
which less than1265/1000
. The issue is due to rounding decimal to binary. Thus it is a problem of inputting the number you meant, not a problem withr2
.
$endgroup$
– Michael E2
12 hours ago
2
$begingroup$
@matheorem The problem with imprecise calculation is that unwanted errors creep in, such as what you're complaining about. :) How about this?:r2[x_, a_] := x (1 + Sign[x] $MachineEpsilon) - Mod[x (1 + Sign[x] $MachineEpsilon), a, -(a/2)]
$endgroup$
– Michael E2
12 hours ago
1
$begingroup$
@matheorem, I think you need to consider why you know the input is exactly 1.265 rather than a little more or a little less, and why the rounding is important to you. If you know the 3rd decimal place is exact, I suggest you multiply all your numbers by 1000, and work with integers.
$endgroup$
– mikado
9 hours ago
|
show 9 more comments
Your Answer
StackExchange.ifUsing("editor", function () {
return StackExchange.using("mathjaxEditing", function () {
StackExchange.MarkdownEditor.creationCallbacks.add(function (editor, postfix) {
StackExchange.mathjaxEditing.prepareWmdForMathJax(editor, postfix, [["$", "$"], ["\\(","\\)"]]);
});
});
}, "mathjax-editing");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "387"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: false,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: null,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fmathematica.stackexchange.com%2fquestions%2f193412%2fefficient-round-edition-with-different-rounding-direction%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
$begingroup$
I offer the following solution
r2[x_, a_] := x - Mod[x, a, -(a/2)]
We can verify that it has the desired result, using PiecewiseExpand
PiecewiseExpand[r2[x, a], -2 a < x < 2 a && a > 0]
Performance is only a little slower than the built-in Round
list = RandomReal[{0, 1}, 1000000];
AbsoluteTiming[Round[list, 0.1];]
(* {0.0079, Null} *)
AbsoluteTiming[r2[list, 0.1];]
(* {0.009414, Null} *)
$endgroup$
$begingroup$
Wow, great solution. But there is a issue with hidden fractions as pointed out by mathematica.stackexchange.com/q/65298/4742 . But if we useInternal
StringToDouble@ToString`, the performance will drop down.
$endgroup$
– matheorem
14 hours ago
$begingroup$
I figured out a trick, though I don't know why it works. The efficient solution to hidden fraction may ber2[x_, a_] := (IntegerPart[(x/a - Mod[x/a, 1, -(1/2)])]*10^12)/ 10.^(12 - 1/Log[a, 10])
$endgroup$
– matheorem
14 hours ago
3
$begingroup$
@matheorem Technically,1.265
in binary floating point corresponds to the fraction5697053528623677/4503599627370496
which less than1265/1000
. The issue is due to rounding decimal to binary. Thus it is a problem of inputting the number you meant, not a problem withr2
.
$endgroup$
– Michael E2
12 hours ago
2
$begingroup$
@matheorem The problem with imprecise calculation is that unwanted errors creep in, such as what you're complaining about. :) How about this?:r2[x_, a_] := x (1 + Sign[x] $MachineEpsilon) - Mod[x (1 + Sign[x] $MachineEpsilon), a, -(a/2)]
$endgroup$
– Michael E2
12 hours ago
1
$begingroup$
@matheorem, I think you need to consider why you know the input is exactly 1.265 rather than a little more or a little less, and why the rounding is important to you. If you know the 3rd decimal place is exact, I suggest you multiply all your numbers by 1000, and work with integers.
$endgroup$
– mikado
9 hours ago
|
show 9 more comments
$begingroup$
I offer the following solution
r2[x_, a_] := x - Mod[x, a, -(a/2)]
We can verify that it has the desired result, using PiecewiseExpand
PiecewiseExpand[r2[x, a], -2 a < x < 2 a && a > 0]
Performance is only a little slower than the built-in Round
list = RandomReal[{0, 1}, 1000000];
AbsoluteTiming[Round[list, 0.1];]
(* {0.0079, Null} *)
AbsoluteTiming[r2[list, 0.1];]
(* {0.009414, Null} *)
$endgroup$
$begingroup$
Wow, great solution. But there is a issue with hidden fractions as pointed out by mathematica.stackexchange.com/q/65298/4742 . But if we useInternal
StringToDouble@ToString`, the performance will drop down.
$endgroup$
– matheorem
14 hours ago
$begingroup$
I figured out a trick, though I don't know why it works. The efficient solution to hidden fraction may ber2[x_, a_] := (IntegerPart[(x/a - Mod[x/a, 1, -(1/2)])]*10^12)/ 10.^(12 - 1/Log[a, 10])
$endgroup$
– matheorem
14 hours ago
3
$begingroup$
@matheorem Technically,1.265
in binary floating point corresponds to the fraction5697053528623677/4503599627370496
which less than1265/1000
. The issue is due to rounding decimal to binary. Thus it is a problem of inputting the number you meant, not a problem withr2
.
$endgroup$
– Michael E2
12 hours ago
2
$begingroup$
@matheorem The problem with imprecise calculation is that unwanted errors creep in, such as what you're complaining about. :) How about this?:r2[x_, a_] := x (1 + Sign[x] $MachineEpsilon) - Mod[x (1 + Sign[x] $MachineEpsilon), a, -(a/2)]
$endgroup$
– Michael E2
12 hours ago
1
$begingroup$
@matheorem, I think you need to consider why you know the input is exactly 1.265 rather than a little more or a little less, and why the rounding is important to you. If you know the 3rd decimal place is exact, I suggest you multiply all your numbers by 1000, and work with integers.
$endgroup$
– mikado
9 hours ago
|
show 9 more comments
$begingroup$
I offer the following solution
r2[x_, a_] := x - Mod[x, a, -(a/2)]
We can verify that it has the desired result, using PiecewiseExpand
PiecewiseExpand[r2[x, a], -2 a < x < 2 a && a > 0]
Performance is only a little slower than the built-in Round
list = RandomReal[{0, 1}, 1000000];
AbsoluteTiming[Round[list, 0.1];]
(* {0.0079, Null} *)
AbsoluteTiming[r2[list, 0.1];]
(* {0.009414, Null} *)
$endgroup$
I offer the following solution
r2[x_, a_] := x - Mod[x, a, -(a/2)]
We can verify that it has the desired result, using PiecewiseExpand
PiecewiseExpand[r2[x, a], -2 a < x < 2 a && a > 0]
Performance is only a little slower than the built-in Round
list = RandomReal[{0, 1}, 1000000];
AbsoluteTiming[Round[list, 0.1];]
(* {0.0079, Null} *)
AbsoluteTiming[r2[list, 0.1];]
(* {0.009414, Null} *)
answered 15 hours ago
mikadomikado
6,6671929
6,6671929
$begingroup$
Wow, great solution. But there is a issue with hidden fractions as pointed out by mathematica.stackexchange.com/q/65298/4742 . But if we useInternal
StringToDouble@ToString`, the performance will drop down.
$endgroup$
– matheorem
14 hours ago
$begingroup$
I figured out a trick, though I don't know why it works. The efficient solution to hidden fraction may ber2[x_, a_] := (IntegerPart[(x/a - Mod[x/a, 1, -(1/2)])]*10^12)/ 10.^(12 - 1/Log[a, 10])
$endgroup$
– matheorem
14 hours ago
3
$begingroup$
@matheorem Technically,1.265
in binary floating point corresponds to the fraction5697053528623677/4503599627370496
which less than1265/1000
. The issue is due to rounding decimal to binary. Thus it is a problem of inputting the number you meant, not a problem withr2
.
$endgroup$
– Michael E2
12 hours ago
2
$begingroup$
@matheorem The problem with imprecise calculation is that unwanted errors creep in, such as what you're complaining about. :) How about this?:r2[x_, a_] := x (1 + Sign[x] $MachineEpsilon) - Mod[x (1 + Sign[x] $MachineEpsilon), a, -(a/2)]
$endgroup$
– Michael E2
12 hours ago
1
$begingroup$
@matheorem, I think you need to consider why you know the input is exactly 1.265 rather than a little more or a little less, and why the rounding is important to you. If you know the 3rd decimal place is exact, I suggest you multiply all your numbers by 1000, and work with integers.
$endgroup$
– mikado
9 hours ago
|
show 9 more comments
$begingroup$
Wow, great solution. But there is a issue with hidden fractions as pointed out by mathematica.stackexchange.com/q/65298/4742 . But if we useInternal
StringToDouble@ToString`, the performance will drop down.
$endgroup$
– matheorem
14 hours ago
$begingroup$
I figured out a trick, though I don't know why it works. The efficient solution to hidden fraction may ber2[x_, a_] := (IntegerPart[(x/a - Mod[x/a, 1, -(1/2)])]*10^12)/ 10.^(12 - 1/Log[a, 10])
$endgroup$
– matheorem
14 hours ago
3
$begingroup$
@matheorem Technically,1.265
in binary floating point corresponds to the fraction5697053528623677/4503599627370496
which less than1265/1000
. The issue is due to rounding decimal to binary. Thus it is a problem of inputting the number you meant, not a problem withr2
.
$endgroup$
– Michael E2
12 hours ago
2
$begingroup$
@matheorem The problem with imprecise calculation is that unwanted errors creep in, such as what you're complaining about. :) How about this?:r2[x_, a_] := x (1 + Sign[x] $MachineEpsilon) - Mod[x (1 + Sign[x] $MachineEpsilon), a, -(a/2)]
$endgroup$
– Michael E2
12 hours ago
1
$begingroup$
@matheorem, I think you need to consider why you know the input is exactly 1.265 rather than a little more or a little less, and why the rounding is important to you. If you know the 3rd decimal place is exact, I suggest you multiply all your numbers by 1000, and work with integers.
$endgroup$
– mikado
9 hours ago
$begingroup$
Wow, great solution. But there is a issue with hidden fractions as pointed out by mathematica.stackexchange.com/q/65298/4742 . But if we use
Internal
StringToDouble@ToString`, the performance will drop down.$endgroup$
– matheorem
14 hours ago
$begingroup$
Wow, great solution. But there is a issue with hidden fractions as pointed out by mathematica.stackexchange.com/q/65298/4742 . But if we use
Internal
StringToDouble@ToString`, the performance will drop down.$endgroup$
– matheorem
14 hours ago
$begingroup$
I figured out a trick, though I don't know why it works. The efficient solution to hidden fraction may be
r2[x_, a_] := (IntegerPart[(x/a - Mod[x/a, 1, -(1/2)])]*10^12)/ 10.^(12 - 1/Log[a, 10])
$endgroup$
– matheorem
14 hours ago
$begingroup$
I figured out a trick, though I don't know why it works. The efficient solution to hidden fraction may be
r2[x_, a_] := (IntegerPart[(x/a - Mod[x/a, 1, -(1/2)])]*10^12)/ 10.^(12 - 1/Log[a, 10])
$endgroup$
– matheorem
14 hours ago
3
3
$begingroup$
@matheorem Technically,
1.265
in binary floating point corresponds to the fraction 5697053528623677/4503599627370496
which less than 1265/1000
. The issue is due to rounding decimal to binary. Thus it is a problem of inputting the number you meant, not a problem with r2
.$endgroup$
– Michael E2
12 hours ago
$begingroup$
@matheorem Technically,
1.265
in binary floating point corresponds to the fraction 5697053528623677/4503599627370496
which less than 1265/1000
. The issue is due to rounding decimal to binary. Thus it is a problem of inputting the number you meant, not a problem with r2
.$endgroup$
– Michael E2
12 hours ago
2
2
$begingroup$
@matheorem The problem with imprecise calculation is that unwanted errors creep in, such as what you're complaining about. :) How about this?:
r2[x_, a_] := x (1 + Sign[x] $MachineEpsilon) - Mod[x (1 + Sign[x] $MachineEpsilon), a, -(a/2)]
$endgroup$
– Michael E2
12 hours ago
$begingroup$
@matheorem The problem with imprecise calculation is that unwanted errors creep in, such as what you're complaining about. :) How about this?:
r2[x_, a_] := x (1 + Sign[x] $MachineEpsilon) - Mod[x (1 + Sign[x] $MachineEpsilon), a, -(a/2)]
$endgroup$
– Michael E2
12 hours ago
1
1
$begingroup$
@matheorem, I think you need to consider why you know the input is exactly 1.265 rather than a little more or a little less, and why the rounding is important to you. If you know the 3rd decimal place is exact, I suggest you multiply all your numbers by 1000, and work with integers.
$endgroup$
– mikado
9 hours ago
$begingroup$
@matheorem, I think you need to consider why you know the input is exactly 1.265 rather than a little more or a little less, and why the rounding is important to you. If you know the 3rd decimal place is exact, I suggest you multiply all your numbers by 1000, and work with integers.
$endgroup$
– mikado
9 hours ago
|
show 9 more comments
Thanks for contributing an answer to Mathematica Stack Exchange!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
Use MathJax to format equations. MathJax reference.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fmathematica.stackexchange.com%2fquestions%2f193412%2fefficient-round-edition-with-different-rounding-direction%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
$begingroup$
Floor[x+0.5]
?$endgroup$
– Szabolcs
15 hours ago
$begingroup$
@Szabolcs But Floor gives integer. Round can round at any digit
$endgroup$
– matheorem
15 hours ago
2
$begingroup$
Are your aware of RoundingRule?
$endgroup$
– Silvia
15 hours ago
1
$begingroup$
Could extend the method proposed by @Szabolcs:
myRound[x_, d_] := d*Floor[x/d + 1/2]
$endgroup$
– Daniel Lichtblau
13 hours ago
1
$begingroup$
That's a result of using decimal values e.g. .01 that do not have exact binary equivalents. Could instead do
myRound[8.121,1/100]
and numericize afterward.$endgroup$
– Daniel Lichtblau
9 hours ago