pretty_round 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/LICENSE +22 -0
- data/README.md +70 -0
- data/examples/example.rb +39 -0
- data/lib/pretty_round.rb +49 -0
- data/test/test_pretty_round.rb +113 -0
- metadata +48 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 715c35c7f940f136ab635fefb6f253f72ce4e712
|
4
|
+
data.tar.gz: 6ff79a9c50c397001a2f12ac00d7076d03316162
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 6987805eeb0bb0183f77ef2a5605d8da58e5dcf5bc030548681269ddc36d93f9cb491de404d66626f5228100a321cef8c70c7c24fb8fe192d5ca696517deed77
|
7
|
+
data.tar.gz: c4e508d1aaec2a2fa399ad5fdf597088d1d7407b5640ff852bb06237a48b1f97de66848725b9f643cb0bb4ab689f248d540e544ee94ce2ec9b90bfea49f91aa3
|
data/LICENSE
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
The MIT License (MIT)
|
2
|
+
|
3
|
+
Copyright (c) 2015 diaphragm
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
7
|
+
in the Software without restriction, including without limitation the rights
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
10
|
+
furnished to do so, subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
13
|
+
copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
21
|
+
SOFTWARE.
|
22
|
+
|
data/README.md
ADDED
@@ -0,0 +1,70 @@
|
|
1
|
+
ruby-pretty-round
|
2
|
+
================
|
3
|
+
This gem add useful numerical rounding methods to `Numeric` class as shown below...
|
4
|
+
- round to nearest multiple
|
5
|
+
- round with significant digits
|
6
|
+
|
7
|
+
Install
|
8
|
+
================
|
9
|
+
`$ gem install pretty_round`
|
10
|
+
|
11
|
+
Usage
|
12
|
+
================
|
13
|
+
```rb
|
14
|
+
require "pretty_round"
|
15
|
+
|
16
|
+
x = 123.456
|
17
|
+
|
18
|
+
# round with precision
|
19
|
+
x.round(2) #=> 123.46 (ruby built-in)
|
20
|
+
x.roundup(2) #=> 123.46
|
21
|
+
x.rounddown(2) #=> 123.45
|
22
|
+
|
23
|
+
# round to nearest multiple
|
24
|
+
x.mroundup(10) #=> 130
|
25
|
+
x.mrounddown(0.01) #=> 123.45
|
26
|
+
x.mround(50) #=> 100
|
27
|
+
x.mround(0.02) #=> 123.46
|
28
|
+
|
29
|
+
# round with significant digit
|
30
|
+
x.sround(2) #=> 120
|
31
|
+
x.sround(4) #=> 123.5
|
32
|
+
```
|
33
|
+
|
34
|
+
Rounding direction
|
35
|
+
================
|
36
|
+
|
37
|
+
`#roundup`, `#mroundup`
|
38
|
+
----------------
|
39
|
+
These methods round up to the positive infinity direction.
|
40
|
+
```rb
|
41
|
+
1.9.mroundup(1) #=> 2
|
42
|
+
1.1.mroundup(1) #=> 2
|
43
|
+
-1.1.mroundup(1) #=> -1
|
44
|
+
-1.9.mroundup(1) #=> -1
|
45
|
+
```
|
46
|
+
|
47
|
+
`#rounddown`, `#mrounddown`
|
48
|
+
----------------
|
49
|
+
These methods round down to the negative infinity direction.
|
50
|
+
```rb
|
51
|
+
1.9.mrounddown(1) #=> 1
|
52
|
+
1.1.mrounddown(1) #=> 1
|
53
|
+
-1.1.mrounddown(1) #=> -2
|
54
|
+
-1.9.mrounddown(1) #=> -2
|
55
|
+
```
|
56
|
+
|
57
|
+
`#mround`, `#sround`
|
58
|
+
----------------
|
59
|
+
These methods round off the absolute value, dos not round even.
|
60
|
+
```rb
|
61
|
+
1.9.mround(1) #=> 2
|
62
|
+
1.1.mround(1) #=> 1
|
63
|
+
-1.1.mround(1) #=> -1
|
64
|
+
-1.9.mround(1) #=> -2
|
65
|
+
```
|
66
|
+
|
67
|
+
----
|
68
|
+
Also, try to run `examples/example.rb`
|
69
|
+
|
70
|
+
|
data/examples/example.rb
ADDED
@@ -0,0 +1,39 @@
|
|
1
|
+
|
2
|
+
require "pretty_round"
|
3
|
+
|
4
|
+
xs = %w[2.1 2.5 2.9 -2.1 -2.5 -2.9].map(&:to_r)
|
5
|
+
ns = %w[0.1 0.2 1 2 -0.1 -0.2 -1 -2].map(&:to_r)
|
6
|
+
|
7
|
+
header = " "*6 + "|" + ns.map{|x| x.to_f.to_s.rjust(6)}.join + "\n" + "-"*(6+1+6*ns.size)
|
8
|
+
|
9
|
+
puts "#mroundup"
|
10
|
+
puts header
|
11
|
+
xs.each do |x|
|
12
|
+
puts ("%6.1f"%x) + "|" + ns.map{|n| x.mroundup(n)}.map{|n| ("%6.1f"%n)}.join
|
13
|
+
end
|
14
|
+
puts
|
15
|
+
|
16
|
+
puts "#mrounddown"
|
17
|
+
puts header
|
18
|
+
xs.each do |x|
|
19
|
+
puts ("%6.1f"%x) + "|" + ns.map{|n| x.mrounddown(n)}.map{|n| ("%6.1f"%n)}.join
|
20
|
+
end
|
21
|
+
puts
|
22
|
+
|
23
|
+
puts "#mround"
|
24
|
+
puts header
|
25
|
+
xs.each do |x|
|
26
|
+
puts ("%6.1f"%x) + "|" + ns.map{|n| x.mround(n)}.map{|n| ("%6.1f"%n)}.join
|
27
|
+
end
|
28
|
+
puts
|
29
|
+
|
30
|
+
|
31
|
+
puts "#sround"
|
32
|
+
xs = [0.1234, 12.34, 1234, -0.1234, -12.34, -1234]
|
33
|
+
ns = [*-1..5]
|
34
|
+
puts " "*10 + "|" + ns.map{|x| x.to_s.center(10)}.join
|
35
|
+
puts "-"*(10+1+10*ns.size)
|
36
|
+
xs.each do |x|
|
37
|
+
puts ("% 10.4f"%x) + "|" + ns.map{|n| x.sround(n)}.map{|n| ("% 10.4f"%n)}.join
|
38
|
+
end
|
39
|
+
|
data/lib/pretty_round.rb
ADDED
@@ -0,0 +1,49 @@
|
|
1
|
+
|
2
|
+
class Numeric
|
3
|
+
# Ceiling with given precision.
|
4
|
+
def roundup(d=0)
|
5
|
+
x = 10**(-d)
|
6
|
+
self.quo(x).ceil * x
|
7
|
+
end
|
8
|
+
|
9
|
+
# Flooring with given precision.
|
10
|
+
def rounddown(d=0)
|
11
|
+
x = 10**(-d)
|
12
|
+
self.quo(x).floor * x
|
13
|
+
end
|
14
|
+
|
15
|
+
|
16
|
+
# Return nearest multiple of given number that is equal to or greater than self.
|
17
|
+
# This method round up to the positive infinity direction.
|
18
|
+
def mroundup(num)
|
19
|
+
div, mod = divmod(num)
|
20
|
+
x = num * div; y = x + (mod.zero? ? 0 : num)
|
21
|
+
[x, y].max
|
22
|
+
end
|
23
|
+
|
24
|
+
# Return nearest multiple of given number that is equal to or less than self.
|
25
|
+
# This method round down to the negative infinity direction.
|
26
|
+
def mrounddown(num)
|
27
|
+
div, mod = divmod(num)
|
28
|
+
x = num * div; y = x + (mod.zero? ? 0 : num)
|
29
|
+
[x, y].min
|
30
|
+
end
|
31
|
+
|
32
|
+
# Retuen nearest multiple of given number.
|
33
|
+
# When self is median of multiple of given number, return the multiple that have greater absolute.
|
34
|
+
def mround(num)
|
35
|
+
div, mod = divmod(num)
|
36
|
+
x = num * div; y = x + (mod.zero? ? 0 : num)
|
37
|
+
if mod.quo(num).abs * 2 == 1
|
38
|
+
[x, y].max_by(&:abs)
|
39
|
+
else
|
40
|
+
[x, y].min_by{|t| (t - self).abs}
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
# Rounding with given significant digit.
|
45
|
+
def sround(digit, base=10)
|
46
|
+
numdigit = Math.log(abs, base).floor + 1
|
47
|
+
mround(base**(numdigit-digit))
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,113 @@
|
|
1
|
+
require 'minitest'
|
2
|
+
require 'pretty_round'
|
3
|
+
|
4
|
+
Minitest.autorun
|
5
|
+
|
6
|
+
class TEST_PrettyRound < Minitest::Test
|
7
|
+
def assert_ep(expect, target)
|
8
|
+
assert_in_epsilon(expect, target, Float::EPSILON)
|
9
|
+
end
|
10
|
+
|
11
|
+
def test_roundup
|
12
|
+
assert_ep 2, 1.9.roundup
|
13
|
+
assert_ep 2, 1.1.roundup
|
14
|
+
assert_ep -1, -1.1.roundup
|
15
|
+
assert_ep -1, -1.9.roundup
|
16
|
+
|
17
|
+
x = 123.456
|
18
|
+
assert_ep 124, x.roundup
|
19
|
+
assert_ep 123.46, x.roundup(2)
|
20
|
+
assert_ep 200, x.roundup(-2)
|
21
|
+
|
22
|
+
x = -123.456
|
23
|
+
assert_ep -123, x.roundup
|
24
|
+
assert_ep -123.45, x.roundup(2)
|
25
|
+
assert_ep -100, x.roundup(-2)
|
26
|
+
end
|
27
|
+
|
28
|
+
def test_rounddown
|
29
|
+
assert_ep 1, 1.9.rounddown
|
30
|
+
assert_ep 1, 1.1.rounddown
|
31
|
+
assert_ep -2, -1.1.rounddown
|
32
|
+
assert_ep -2, -1.9.rounddown
|
33
|
+
|
34
|
+
x = 123.456
|
35
|
+
assert_ep 123, x.rounddown
|
36
|
+
assert_ep 123.45, x.rounddown(2)
|
37
|
+
assert_ep 100, x.rounddown(-2)
|
38
|
+
|
39
|
+
x = -123.456
|
40
|
+
assert_ep -124, x.rounddown
|
41
|
+
assert_ep -123.46, x.rounddown(2)
|
42
|
+
assert_ep -200, x.rounddown(-2)
|
43
|
+
end
|
44
|
+
|
45
|
+
def test_mroundup
|
46
|
+
assert_ep 2, 1.9.mroundup(1)
|
47
|
+
assert_ep 2, 1.1.mroundup(1)
|
48
|
+
assert_ep -1, -1.1.mroundup(1)
|
49
|
+
assert_ep -1, -1.9.mroundup(1)
|
50
|
+
|
51
|
+
x = 123.456
|
52
|
+
assert_ep 124, x.mroundup(-1)
|
53
|
+
assert_ep 123.46, x.mroundup(-0.01)
|
54
|
+
assert_ep 200, x.mroundup(100)
|
55
|
+
|
56
|
+
x = -123.456
|
57
|
+
assert_ep -123, x.mroundup(-1)
|
58
|
+
assert_ep -123.45, x.mroundup(-0.01)
|
59
|
+
assert_ep -100, x.mroundup(100)
|
60
|
+
end
|
61
|
+
|
62
|
+
def test_mrounddown
|
63
|
+
assert_ep 1, 1.9.mrounddown(1)
|
64
|
+
assert_ep 1, 1.1.mrounddown(1)
|
65
|
+
assert_ep -2, -1.1.mrounddown(1)
|
66
|
+
assert_ep -2, -1.9.mrounddown(1)
|
67
|
+
|
68
|
+
x = 123.456
|
69
|
+
assert_ep 123, x.mrounddown(-1)
|
70
|
+
assert_ep 123.45, x.mrounddown(-0.01)
|
71
|
+
assert_ep 100, x.mrounddown(100)
|
72
|
+
|
73
|
+
x = -123.456
|
74
|
+
assert_ep -124, x.mrounddown(-1)
|
75
|
+
assert_ep -123.46, x.mrounddown(-0.01)
|
76
|
+
assert_ep -200, x.mrounddown(100)
|
77
|
+
end
|
78
|
+
|
79
|
+
def test_mround
|
80
|
+
assert_ep 2, 1.9.mround(1)
|
81
|
+
assert_ep 1, 1.1.mround(1)
|
82
|
+
assert_ep -1, -1.1.mround(1)
|
83
|
+
assert_ep -2, -1.9.mround(1)
|
84
|
+
|
85
|
+
x = 123.456
|
86
|
+
assert_ep 123, x.mround(-1)
|
87
|
+
assert_ep 123.46, x.mround(-0.01)
|
88
|
+
assert_ep 100, x.mround(100)
|
89
|
+
|
90
|
+
x = -123.456
|
91
|
+
assert_ep -123, x.mround(-1)
|
92
|
+
assert_ep -123.46, x.mround(-0.01)
|
93
|
+
assert_ep -100, x.mround(100)
|
94
|
+
end
|
95
|
+
|
96
|
+
def test_sround
|
97
|
+
x = 123.456
|
98
|
+
assert_ep 0, x.sround(-1)
|
99
|
+
assert_ep 0, x.sround(0)
|
100
|
+
assert_ep 100, x.sround(1)
|
101
|
+
assert_ep 123, x.sround(3)
|
102
|
+
assert_ep 123.5, x.sround(4)
|
103
|
+
assert_ep 123.456, x.sround(6)
|
104
|
+
|
105
|
+
x = -123.456
|
106
|
+
assert_ep 0, x.sround(-1)
|
107
|
+
assert_ep 0, x.sround(0)
|
108
|
+
assert_ep -100, x.sround(1)
|
109
|
+
assert_ep -123, x.sround(3)
|
110
|
+
assert_ep -123.5, x.sround(4)
|
111
|
+
assert_ep -123.456, x.sround(6)
|
112
|
+
end
|
113
|
+
end
|
metadata
ADDED
@@ -0,0 +1,48 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: pretty_round
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- diaphragm
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2015-10-21 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description: This gem provide useful numerical rounding methods.
|
14
|
+
email:
|
15
|
+
executables: []
|
16
|
+
extensions: []
|
17
|
+
extra_rdoc_files: []
|
18
|
+
files:
|
19
|
+
- LICENSE
|
20
|
+
- README.md
|
21
|
+
- examples/example.rb
|
22
|
+
- lib/pretty_round.rb
|
23
|
+
- test/test_pretty_round.rb
|
24
|
+
homepage: https://github.com/diaphragm/ruby-pretty-round
|
25
|
+
licenses:
|
26
|
+
- MIT
|
27
|
+
metadata: {}
|
28
|
+
post_install_message:
|
29
|
+
rdoc_options: []
|
30
|
+
require_paths:
|
31
|
+
- lib
|
32
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
33
|
+
requirements:
|
34
|
+
- - ">="
|
35
|
+
- !ruby/object:Gem::Version
|
36
|
+
version: '1.8'
|
37
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
38
|
+
requirements:
|
39
|
+
- - ">="
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
version: '0'
|
42
|
+
requirements: []
|
43
|
+
rubyforge_project:
|
44
|
+
rubygems_version: 2.4.5
|
45
|
+
signing_key:
|
46
|
+
specification_version: 4
|
47
|
+
summary: pretty rounding methods library
|
48
|
+
test_files: []
|