如果情节
y = 1/-279x + 280/279
反映了你想要什么。
我用Ruby编写了以下脚本,应该很容易翻译成PHP:
require "bundler/inline"
gemfile do
gem "rspec"
end
require "rspec/autorun"
MAX_SIZE_PERCENTAGE = 1.0
def size_it(text_length, maximum_length)
alpha = - MAX_SIZE_PERCENTAGE / (maximum_length - MAX_SIZE_PERCENTAGE)
beta = maximum_length / (maximum_length - MAX_SIZE_PERCENTAGE)
((alpha * text_length) + beta).round(2)
end
RSpec.describe "dynamic size calculation" do
it "100% when minimal size" do
text_length = 1
maximum_size = 280
expect(size_it(text_length, maximum_size)).to eq(1)
end
it "75% when almost too short" do
text_length = 70
maximum_size = 280
expect(size_it(text_length, maximum_size)).to eq(0.75)
end
it "50% when half point" do
text_length = 140
maximum_size = 280
expect(size_it(text_length, maximum_size)).to eq(0.5)
end
it "25% when almost too long" do
text_length = 210
maximum_size = 280
expect(size_it(text_length, maximum_size)).to eq(0.25)
end
it "0% when maximum size" do
text_length = 280
maximum_size = 280
expect(size_it(text_length, maximum_size)).to eq(0)
end
end
数学是直观的,有一些地雷:
-
整数除法,例如1/280导致0而不是0.0003,我通过调用
.to_f
,Ruby的方式来铸造浮动。
-
舍入误差,预期为0.25,实际为0.2503213,我通过调用进行了调整
round(2)
,Ruby四舍五入到最接近的小数点。