bc is ignoring scale option
as Carl pointed out, if you check man page, you can find that line. it is about expression explanations. subtraction won't read scale
variable. If you want to get the expected result (1.30), you could:
kent$ echo 'scale=2; (2.777 - 1.4744)/1' | bc
1.30
/
operation will read scale
variable.
bc arithmetic Error
The key here is to be sure to use printf with the formatting spec of "%.3f" and printf will take care of doing the rounding as you wish, as long as "scale=4" for bc.
Here's a script that works:
echo -e "please enter math to calculate: \c"
read x
printf "%.3f\n" $(echo "scale=4;$x" | bc -l)
You can get an understanding of what is going on with the above solution, if you run this command at the commandline: echo "scale=4;5+50*3/20 + (19*2)/7" | bc
the result will be 17.9285. When that result is provided to printf as an argument, the function takes into account the fourth decimal place and rounds up the value so that the formatted result displays with precisely three decimal places and with a value of 17.929.
Alternatively, this works, too without a pipe by redirecting the here document as input for bc, as follows which avoids creating a sub-shell:
echo -e "please enter math to calculate: \c"
read x
printf "%.3f\n" $(bc -l <<< "scale=4;$x")
Transform scale keeps the original space around the scaled element
A brutal way would be to virtually reduce space needed by element.
Your example shows a known width & height, so it makes it easy. else you would need a javascript method.
.box_1 {
width: 300px;
height: 300px;
transform: scale(0.5);
transform-origin: left top;
margin-bottom:-150px;
margin-right:-150px;
}
https://jsfiddle.net/0bc4sxk3/1/
Scaling up would mean positive margins.
Transform only happens at screen, elements still use initial room and place needed in the flow of the document.
How to use second piping with echo and bc commands?
Your first line works fine:
grep -ow "^[0-9]*$" numbers.txt | xargs -I {} echo "scale=8; sqrt({})" | bc -l
PHP BC Math library ignore rounding rules
Thank you Christos Lytras for pointing what I did wrong. Because I'm using BCMath calculations in multiple classes and I don't have enough time to rewrite all places with floats to integers, I decided to create simple trait. It solves all my problems with rounded values. Here is trait code:
trait FloatCalculationsTrait
{
/**
* Default precision for function results
*
* @var integer
*/
protected $scale = 2;
/**
* Default precision for BCMath functions
*
* @var integer
*/
protected $bcMathScale = 10;
/**
* Rounding calculation values, based on https://stackoverflow.com/a/60794566/3212936
*
* @param string $valueToRound
* @param integer|null $scale
* @return float
*/
protected function round(string $valueToRound, ?int $scale = null): float
{
if ($scale === null) {
$scale = $this->scale;
}
$result = $valueToRound;
if (strpos($valueToRound, '.') !== false) {
if ($valueToRound[0] != '-') {
$result = bcadd($valueToRound, '0.' . str_repeat('0', $scale) . '5', $scale);
} else {
$result = bcsub($valueToRound, '0.' . str_repeat('0', $scale) . '5', $scale);
}
}
return $result;
}
/**
* Add floats
*
* @param float|null $firstElement
* @param float|null $secondElement
* @param integer|null $scale
* @return float
*/
protected function add(?float $firstElement, ?float $secondElement, ?int $scale = null): float
{
$result = bcadd($firstElement, $secondElement, $this->bcMathScale);
return $this->round($result, $scale);
}
/**
* Substract floats
*
* @param float|null $firstElement
* @param float|null $secondElement
* @param integer|null $scale
* @return float
*/
protected function substract(?float $firstElement, ?float $secondElement, ?int $scale = null): float
{
$result = bcsub($firstElement, $secondElement, $this->bcMathScale);
return $this->round($result, $scale);
}
/**
* Alias for `substract` function
*
* @param float|null $firstElement
* @param float|null $secondElement
* @param integer|null $scale
* @return float
*/
protected function sub(?float $firstElement, float $secondElement, ?int $scale = null): float
{
return $this->substract($firstElement, $secondElement, $scale);
}
/**
* Multiply floats
*
* @param float|null $firstElement
* @param float|null $secondElement
* @param integer|null $scale
* @return float
*/
protected function multiply(?float $firstElement, ?float $secondElement, ?int $scale = null): float
{
$result = bcmul($firstElement, $secondElement, $this->bcMathScale);
return $this->round($result, $scale);
}
/**
* Alias for `multiply` function
*
* @param float|null $firstElement
* @param float|null $secondElement
* @param integer|null $scale
* @return float
*/
protected function mul(?float $firstElement, ?float $secondElement, ?int $scale = null): float
{
return $this->multiply($firstElement, $secondElement, $scale);
}
/**
* Divide floats
*
* @param float|null $firstElement
* @param float|null $secondElement
* @param integer|null $scale
* @return float
*/
protected function divide(?float $firstElement, ?float $secondElement, ?int $scale = null): float
{
$result = bcdiv($firstElement, $secondElement, $this->bcMathScale);
return $this->round($result, $scale);
}
/**
* Alias for `divide` function
*
* @param float|null $firstElement
* @param float|null $secondElement
* @param integer|null $scale
* @return float
*/
protected function div(?float $firstElement, ?float $secondElement, ?int $scale = null): float
{
return $this->divide($firstElement, $secondElement, $scale);
}
}
And here you can check results: http://sandbox.onlinephpfunctions.com/code/5b602173a1825a2b2b9f167a63646477c5105a3c
How can you echo input to the bc command from bash?
For math functions to be defined in bc
, you need to specify the -l
option. Otherwise, bc
will tell you that functions like l
are not defined.
So it has nothing to do with the alias. I have no idea how it works with tcsh
-- it doesn't on my (ubuntu) system. Although including the -l
, even through the alias -- as in semitone -l
-- works fine both with bash
and tcsh
Unable to load stencil components lib with Vue3 using Vite
This issue has been fixed by Stencil in version 2.16.
Upgrading Stencil to 2.16.1 in the components library dependency and rebuilding it with the experimentalImportInjection
flag solved the problem.
Then, I can import it following the official documentation:
main.ts
import '@telekom/scale-components-neutral/dist/scale-components/scale-components.css';
import { applyPolyfills, defineCustomElements } from '@telekom/scale-components-neutral/loader';
const app = createApp(App);
applyPolyfills().then(() => {
defineCustomElements(window);
});
And configure the custom elements in vite config:
vite.config.js
export default defineConfig({
plugins: [vue({
template: {
compilerOptions: {
isCustomElement: (tag) => tag.startsWith('scale-')
}
}
})]
// ...
})
Related Topics
Enable/Disable Tasks in Crontab by Bash/Shell
Pipe Output to Use as the Search Specification for Grep on Linux
How to See Top Processes Sorted by Actual Memory Usage
Read Line by Line in Bash Script
Location of .Bashrc for "Bash on Ubuntu on Windows" in Windows 10
How to Specify Filenames Within a Zip When Creating It on the Command Line from a Pipe
How to Add a Cron Job in Linux
How to Listen for Mouse Events in Linux
How to Check Status of Urls from Text File Using Bash Shell Script
Sighup for Reloading Configuration
Linux Usb: Turning the Power on and Off
How to Get the Last Word in Each Line with Bash
One Command to Create a Directory and File Inside It Linux Command